日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Codechef Coders’Legacy 2018 CLSUMG Sum of Primes

發(fā)布時間:2025/3/15 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codechef Coders’Legacy 2018 CLSUMG Sum of Primes 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

  • 設(shè) f(x) 表示把 x 拆分成兩個質(zhì)數(shù)之和的方案數(shù)。

  • 例如 f(10)=2 , 因為 10=3+7=5+5

  • T 次詢問,每次給出 n,問有多少對 (a,b) 滿足 0abnf(a)+f(b)=f(n)

  • 數(shù)據(jù)范圍:1T50n1,000,000

Sample Input:

3
1
5
10

Sample Output:

1
4
21

Solution

  • 我們把質(zhì)數(shù)看做 1 ,非質(zhì)數(shù)看成 0 。

  • 即設(shè)一個數(shù)組 h[i] ,若 i 為質(zhì)數(shù)則 h[i]=1 ,否則 h[i]=0

  • n106 ,我們可以直接 O(n) 篩出 h[i]

  • 觀察 f[i] 的定義和數(shù)論卷積的定義,我們可以愉快地發(fā)現(xiàn) f 就是兩個 h 卷起來!

  • 之后再去一下重就能預(yù)處理出 f 了!用 FFT 快速算 f[i] 可以做到 O(n?log?n)

  • 接下來就可以輕松地處理詢問了。

  • 用一個桶直接 O(n) 掃一遍就可以啦!

  • 倒著枚舉 i ,則答案加上 t[f[n]?f[i]] ,之后 t[f[i]]++

  • 總時間復(fù)雜度 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; }

總結(jié)

以上是生活随笔為你收集整理的Codechef Coders’Legacy 2018 CLSUMG Sum of Primes的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。