2013 ACM/ICPC Asia Regional Changsha Online G Goldbach

T.T~呜呜~先痛哭一番~

赛后260ms AC~

比赛的时候,破ShineCheng 7800ms AC了之后就不再搭理我的想法了~

代码最大的问题:相减得负(赛后找到了);相乘溢出这个比赛的时候改出来了

思路:80000个数字里有pnum=7000+个素数,O(pnum*pnum)预处理求出两两素数的乘积sumCount  与  和出现的次数mulCount

计算是O(Pnum)所以哈哈,就说是正解嚒。。。

问题就是去重~


for: 素数枚举 prime[i]     //代码里面用栈存的素数

① x=x                 res+=isPrime[x]
② x=a+b(a<=b)          res+=sumCount[ prime[i] ]
③ x=a*b(a<=b)          res+= mulCount[ prime[i] ]
④ x=a+a+b 或 a+b+b(a<=b)   if(prime[ x-2*prime[i] ])   res++;      
                            //这里就是错误的原因,因为x-2*prime[i]可能出现负数
⑤ x=a+b+c(a、b、c各不同)   res+=sumCount[ x-prime[i] ]-(重复的,具体看代码吧,挺简单的)
⑥ x=a*a*b 或 a*b*b (a<=b)  if(prime[ x/(2*prime[i]) ])   res++;
⑦ x=a*b*c(a、b、c各不同)   res+=mulCount[ x-prime[i] ]-(重复的,具体看代码吧,挺简单的)


看到去年长春现场赛北理工把“神题”当水题过了这个经历之后,就感觉其实题目并没有多么复杂,慢慢的把情况分细了,

理清头绪,有时候很多题还是可以ac的,于是就抱着这个心态ac了成都网络赛的一道题,这道题有点遗憾,现场没ac~

 

由于总共有7000+个素数,答案根本不会超过mod值,所以根本不需要mod~

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <string.h>
 5 #include <math.h>
 6 using namespace std;
 7 const int N=80000;
 8 const int M=8000;
 9 int pnum;
10 int isPrime(int x){
11     int i;
12     for(i=2;i*i<=x;i++){
13         if(x%i==0) return 0;
14     }
15     return 1;
16 }
17 
18 long long stack[M+10];
19 bool prime[N+10]={0};
20 int mulCount[N+10]={0};
21 int sumCount[N+10]={0};
22 
23 int main(){
24     long long res,res1,res2,res3;
25     int i,j;
26     pnum=0;
27     prime[2]=1;
28     stack[pnum++]=2;
29     for(i=3;i<=N;i++){
30         if(isprime(i)) {
31             stack[pnum++]=i;
32             prime[i]=1;
33         }
34     }
35     for(i=0;i<pnum;i++){
36         for(j=i;j<pnum;j++){
37             if(stack[i]+stack[j]<=N) sumCount[stack[i]+stack[j]]++;
38             if(stack[i]*stack[j]<=N) mulCount[stack[i]*stack[j]]=1;
39         }
40     }
41     int x,y,z;//x=x y=x-prime z=x/prime
42 
43     while(cin>>x){
44         //res1=a+b+c(a<b<c) res2=a*b*c(a<b<c) res3=a+b*c(a、b、c任意)
45         res=res1=res2=res3=0;
46 
47         if(prime[x]) res++;//x=x;
48         res+=sumCount[x];//res=a+b
49         res+=mulCount[x];//res=a*b
50 
51         for(i=0;stack[i]<x&&i<pnum;i++){
52             //res3=a+b*c;
53             y=x-stack[i];res3+=mulCount[y];
54 
55             //a+a+b a+b+b a<=b
56             if(x-stack[i]-stack[i]>0&&prime[ x-stack[i]-stack[i] ]) res++;
57 
58             //a+b+c a<b<c
59             long long sumCounty=sumCount[y];
60             if(y%2==0&&prime[y/2]) sumCounty--;//stack[i]+a+a
61             if(y-stack[i]>0&&prime[y-stack[i]]) sumCounty--;//stack[i]+stack[i]+a
62             if(y-stack[i]==stack[i]) sumCounty++;//stack[i]+stack[i]+stack[i]
63             res1+=sumCounty;
64 
65             //a*a*b a*b*b a<=b
66             if(x%(stack[i]*stack[i])==0&&prime[ x/(stack[i]*stack[i]) ]) res++;
67 
68             //a*b*c a<b<c
69             if(x%stack[i]==0){
70                 z=x/stack[i];
71                 long long mulCountz=mulCount[z];//stack*a*a a*stack*stack
72                 long long now=(long long)sqrt(z);
73                 if(prime[now]&&now*now*stack[i]==x) mulCountz--;//stack[i]*a*a
74                 if(z%stack[i]==0&&prime[ z/stack[i] ]&&z/stack[i]*stack[i]*stack[i]==x) mulCountz--;//stack[i]*stack[i]*a
75                 if(stack[i]*stack[i]*stack[i]==x) mulCountz++;
76                 res2+=mulCountz;
77             }
78         }
79 
80         res+=res1/3;
81         res+=res2/3;
82         res+=res3;
83 
84         cout<<res<<endl;
85     }
86     return 0;
87 }
View Code

 

posted @ 2013-09-23 17:18  _sunshine  阅读(335)  评论(1编辑  收藏  举报