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
",ans);
63     }
64     return 0;
65 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3334646.html