数论——费马平方和

原题链接

题意很简单,但如何做呢? 。。。。

百度词条
以我现在的水平只能看懂前三步
因为结论我也不会证,所以直接上结论:

先打张表:

#include
#include
using namespace std;

const int N=300010000;
int n;
int prime[30000100];
int ans=0,cnt=0;
bitset<300000000> vis;
inline void get_prime()
{
	for(register int i=2;i<=n;i++){
		if(!vis[i])
	   {
	   	prime[++cnt]=i;
	   }
	   for(register int j=1;j<=cnt&&prime[j]*i<=n;j++){
	   	vis[prime[j]*i]=1;
	   	if(i%prime[j]==0) break;
	   }
	}
}
int main(){
	scanf("%d",&n);
	get_prime();
	printf("%d",cnt);
	}

输入:300000000
输出:16252325

根据费马平方和可知
当且仅当质数p=4*k+1(k为正整数)时才能满足结论

数据范围卡得有点紧,开bitset才能过

#include
#include
using namespace std;

const int N=300010000;
int l,r;
int prime[16252325];
int ans=0,cnt=0;
bitset<300000000> vis;
inline void get_prime()
{
	for(register int i=2;i<=r;i++){
		if(!vis[i])
	   {
	   	if(i==2&&i>=l) ans++;
	   	if(i>=l&&i%4==1) {ans++;}
	   	prime[++cnt]=i;
	   }
	   for(register int j=1;j<=cnt&&prime[j]*i<=r;j++){
	   	vis[prime[j]*i]=1;
	   	if(i%prime[j]==0) break;
	   }
	}
}
int main(){
	scanf("%d%d",&l,&r);
	get_prime();
	printf("%d",ans);
	}```

你可能感兴趣的:(例题,数论)