Codechef Coders’Legacy 2018 CLSUMG Sum of Primes
生活随笔
收集整理的這篇文章主要介紹了
Codechef Coders’Legacy 2018 CLSUMG Sum of Primes
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
設 f(x) 表示把 x 拆分成兩個質數之和的方案數。
例如 f(10)=2 , 因為 10=3+7=5+5
T 次詢問,每次給出 n,問有多少對 (a,b) 滿足 0≤a≤b<n 且 f(a)+f(b)=f(n) 。
數據范圍:1≤T≤5,0≤n≤1,000,000 。
Sample Input:
3
1
5
10
Sample Output:
1
4
21
Solution
我們把質數看做 1 ,非質數看成 0 。
即設一個數組 h[i] ,若 i 為質數則 h[i]=1 ,否則 h[i]=0 。
而 n≤106 ,我們可以直接 O(n) 篩出 h[i] 。
觀察 f[i] 的定義和數論卷積的定義,我們可以愉快地發現 f 就是兩個 h 卷起來!
之后再去一下重就能預處理出 f 了!用 FFT 快速算 f[i] 可以做到 O(n?log?n) 。
接下來就可以輕松地處理詢問了。
用一個桶直接 O(n) 掃一遍就可以啦!
倒著枚舉 i ,則答案加上 t[f[n]?f[i]] ,之后 t[f[i]]++ 。
總時間復雜度 O(n?log?n) 。
Code
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int N=1e6+5; const double Pi=acos(-1.0); struct comp {double r,i;comp(){}comp(double rr,double ii){r=rr,i=ii;}comp operator +(const comp &x)const{return comp(r+x.r,i+x.i);}comp operator -(const comp &x)const{return comp(r-x.r,i-x.i);}comp operator *(const comp &x)const{return comp(r*x.r-i*x.i,i*x.r+r*x.i);} }f1[N<<2],f2[N<<2]; int T,n,m; int f[N],g[N],h[N],rev[N<<2],tt[N]; bool bz[N]; inline void FFT(comp *y,int ff) {for(int i=0;i<m;i++)if(i<rev[i]) swap(y[i],y[rev[i]]);for(int h=2;h<=m;h<<=1){comp wn(cos(2*Pi/h),ff*sin(2*Pi/h));for(int i=0;i<m;i+=h){comp w(1,0);for(int k=i;k<i+h/2;k++){comp u=y[k],t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(ff==-1) for(int i=0;i<m;i++) y[i].r/=m; } int main() {for(int i=2;i<N;i++){if(!bz[i]) g[++g[0]]=i;for(int j=1;j<=g[0] && i*g[j]<N;j++){bz[i*g[j]]=true;if(i%g[j]==0) break;}}for(int i=2;i<N;i++) h[i]=!bz[i];int l=0;for(m=1;m<N+N;m<<=1) l++;for(int i=0;i<m;i++) rev[i]=rev[i>>1]>>1|(i&1)<<l-1;for(int i=0;i<N;i++) f1[i]=f2[i]=comp(h[i],0);FFT(f1,1),FFT(f2,1);for(int i=0;i<m;i++) f1[i]=f1[i]*f2[i];FFT(f1,-1);for(int i=1;i<N;i++) f[i]=(int)(f1[i].r+0.5);for(int i=1;i<N;i++)if(i&1) f[i]>>=1; else f[i]=(f[i]+h[i>>1])>>1;scanf("%d",&T);while(T--){scanf("%d",&n);memset(tt,0,sizeof(tt));LL ans=0;for(int i=n-1;i>=0;i--){tt[f[n]-f[i]]++;ans+=tt[f[i]];}printf("%lld\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的Codechef Coders’Legacy 2018 CLSUMG Sum of Primes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5678. 【GDOI2018
- 下一篇: JZOJ 5689. 【GDOI2018