Codeforces 114E

题目链接  

题意

在[l,r]这个区间里有多少质数可以拆分成a^2+b^2的形式,a和b是大于0的整数

题解

通过玄学观察可以发现,可以拆分成a^2+b^2的整数肯定是4*k+1(不会证),k是整数。那么现在要解决的问题就是如何筛出这么多质数。因为要筛选的范围很大,有3e8那么大,线性筛都会TLE。所以就在这里使用了一种更快的方法。在这种情况下,优化过的Eratoshthenes算法比欧拉筛更快。具体实现可以看代码。再加上某秘传头文件和卡常终于ac。

#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(3)
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bitset>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iostream>
#define N 300000000
#define R register

using namespace std;

bitset<N+5> pd;
int l,r;
int prime[16777216],jis=-1;//这个范围是先用vector确定,然后卡常数的时候就换成了数组。

void init(){//更快的筛法
    int maxn=sqrt(N+0.5);
    for(R int i=4;i<N;i+=2) pd[i]=1;
    for(R int i=3;i<maxn;i+=2){
        if(!pd[i]) for(R int j=i*i;j<N;j+=(i<<1)) pd[j]=1;
    }
    for(R int i=2;i<=N;++i) if(!pd[i]) prime[++jis]=i;
}
int main(){
    init();
    cin>>l>>r;
    int start=lower_bound(prime,prime+16252326,l)-prime;
    int end=upper_bound(prime,prime+16252326,r)-prime-1;
    int ans=0;
    for(R int i=start;i<=end;++i) if((prime[i]-1)%4==0) ++ans;
    if(l<=2&&r>=2) ++ans;
    cout<<ans;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/jiaangk/p/9203806.html