交稅

ddgo發表於2020-10-22

題目地址

由題目分析得到。把稅分成儘可能少的質數堆。

每次找到 比n小的最大質數,注意兩個質數間的距離很小,所以我們直接列舉一下,再用sqrt(n)去檢查是否為質數就可以了。是的話就cnt++,且 n-= 當前質數。直到 n <=2.

複雜度大致為 200 * 常數 * sqrt(n)

程式碼:

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int mod = 1000000007;
const int N = 1e5+10;

bool check(int n){
	for(int i=2;i<=n/i;i++){
		if(n % i == 0) return false;
	}
	return true;
}

signed main(){
//	IOS;
	#ifdef ddgo
		freopen("C:\\Users\\asus\\Desktop\\ddgoin.txt","r",stdin);
	#endif

	int n,cnt = 0; cin>>n;
	while(n > 2){
		for(int i=n;;i--){
			if(check(i)){
				cnt++;
				n -= i;
				break;
			}
		}
	}
	if(n >= 1) cnt++;
	cout<<cnt;
	
	return 0;
}

相關文章