Problem
- 给定闭区间[l,r],找出区间内有多少给素数t满足t=a2+b2,a和b是任意正整数。
费马二平方定理
- 除了2以外所有素数都可以表示成4k+1或4k+3。
- 4k+1可以分解为随机两个整数的平方和,而4k+3则不行。
bitset
- l,r<=3e8,开不了这么大的数组,但在赋值上只有0和1,可用bitset存,当成3e8个二进制位处理。
Code
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
const int maxn=3e8+5;
int pri[20000005],p;
bitset<maxn> ispr;
long long l,r,ans;
int main()
{
ispr[0]=ispr[1]=1;
for (int i = 2;i <= 3e8; i++)
{
if (!ispr[i])
pri[++p] = i;
for (int j = 1; j <=p && i*pri[j] <= 3e8; j++)
{
ispr[i*pri[j]] = 1;
if (i % pri[j] == 0)
break;
}
}
cin>>l>>r;
for(int i=1;i<=p;i++)
{
if(pri[i]>=l&&pri[i]<=r&&pri[i]%4==1)
ans++;
}
if(l<=2&&r>=2)
ans++;
cout<<ans;
}