2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!!
赛后才知道,坑啊…………
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #define ll long long 7 #define M 80001 8 #define mod 1000000007 9 using namespace std; 10 int prime[M/3],cnt,p[M]; 11 bool f[M]; 12 void init() 13 { 14 cnt=0; 15 memset(f,0,sizeof(f)); 16 for(int i=2;i<M;i++){ 17 if(!f[i]) prime[cnt++]=i; 18 for(int j=0;j<cnt&&i*prime[j]<M;j++){ 19 f[i*prime[j]]=1; 20 if(i%prime[j]==0) break; 21 } 22 } 23 memset(p,-1,sizeof(p)); 24 } 25 int cal(int n) 26 { 27 int nn=n; 28 if(p[n]!=-1) return p[n]; 29 int m=0; 30 for(int i=0;i<cnt&&prime[i]<=nn;i++){ 31 if(nn%prime[i]==0){ 32 m++; 33 nn/=prime[i]; 34 while(nn%prime[i]==0){ 35 m++; 36 if(m>3) return p[n]=4; 37 nn/=prime[i]; 38 } 39 if(m>3) return p[n]=4; 40 } 41 } 42 if(nn>1) m++; 43 if(m>3) return p[n]=4; 44 return p[n]=m; 45 } 46 int main() 47 { 48 int n; 49 init(); 50 while(scanf("%d",&n)!=EOF){ 51 int ans=0; 52 if(!f[n]||cal(n)<=3) ans++;//全是乘法 53 for(int i=0;i<cnt&&prime[i]<=n;i++){//乘法和加法 54 if(cal(n-prime[i])==2) ans++; 55 } 56 for(int i=0;i<cnt&&2*prime[i]<=n;i++)//2个数加 57 if(f[n-prime[i]]==0) ans++; 58 for(int i=0;i<cnt&&3*prime[i]<=n;i++){//三个数加 59 for(int j=i;prime[i]+2*prime[j]<=n;j++) 60 if(f[n-prime[i]-prime[j]]==0) ans++; 61 } 62 printf("%d\n",ans); 63 } 64 return 0; 65 }