Codeforces Beta Round #86 (Div. 1 Only) C. Double Happiness【暴力】【費馬平方和定理】

題目鏈接:https://codeforc.es/contest/113/problem/C
題目大意:給定區間[l,r][l,r],計算此區間內數tt滿足:tt爲素數,且t=a2+b2t=a^2+b^2的個數。
思路:首先由費馬平方和定理可知:對於t=a2+b2t=a^2+b^2,那麼:t=4k+1,kt=4*k+1,k爲正整數。題目給的內存無法直接開數組,需要用vectorvector開闢動態空間,然後先素數篩一下區間素數,然後對篩出來的素數暴力判斷計數就okok了。
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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章