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 }