玄关素数筛开1005就是错的1010就对为什么
查看原帖
玄关素数筛开1005就是错的1010就对为什么
226167
呆呆的她啊楼主2024/3/22 22:46

rt 第二个测试点 N=1000

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
const int range=2e5+5;
const int MAXN=1e3+10;
int n;
int a[200005];
bool isprime[MAXN]; 
int prime[MAXN];  
int cnt; 
void euler()
{
	//96557227483691514  1005输出的 
	//48278613741845757   1010时
	memset(isprime, true, sizeof(isprime)); // 先全部标记为素数
	isprime[1] = false; // 1不是素数
	for(int i = 2; i <= MAXN; ++i) 
	{
		if(isprime[i]) prime[++cnt] = i;
		for(int j = 1; j <= cnt && i * prime[j] <= MAXN; ++j)
		{
			isprime[i * prime[j]] = false;
			if(i % prime[j] == 0) break;
		}
	}
}
int f[range];
void solve()
{  
	euler();
	int n;
	cin>>n;
	f[0]=1;
	int g=lower_bound(prime+1,prime+1+cnt,n)-prime;
	if(prime[g]>n)g--;
	for(int i=1;i<=g;i++)
	{
		for(int j=prime[i];j<=n;j++)
		{
			f[j]+=f[j-prime[i]];
		}
	}
	cout<<f[n];	
}
signed main()
{
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
	
	
} 
2024/3/22 22:46
加载中...