題目鏈接:https://codeforc.es/contest/113/problem/C
題目大意:給定區間,計算此區間內數滿足:爲素數,且的個數。
思路:首先由費馬平方和定理可知:對於,那麼:爲正整數。題目給的內存無法直接開數組,需要用開闢動態空間,然後先素數篩一下區間素數,然後對篩出來的素數暴力判斷計數就了。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int l,r;
vector<bool>vis;//不能直接開數組,會MLE
int main()
{
scanf("%d%d",&l,&r);
int cnt=0;
vis.resize(r+5);
vis[1]=1;
vis[2]=0;
for(ll i=3;i<=r;i+=2){
if(vis[i]==0){
for(ll j=i*i;j<=r;j+=2*i){
vis[j]=1;//先對區間進行素數篩,0表示是素數,1表示不是素數
}
}
}
if(l<=2&&r>=2){
cnt++;//2這個數滿足關係
}
if(l%4==2){
l+=3;//將l設置到下一個4*k+1的位置,方便循環起點
}
else if(l%4==3){
l+=2;
}
else if(l%4==0){
l+=1;
}
else if(l==1){
l+=4;
}
for(int i=l;i<=r;i+=4){
if(vis[i]==0&&(i%4==1)){//a*a+b*b=4*k+1是費馬平方和定理
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}