zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    1113. Integer Set Partition (25)
    1110. Complete Binary Tree (25)
    1109. Group Photo (25)
    Bender Problem
    格子中输出
    牌型种数
    移动距离
    QQ帐户的申请与登陆(25 分)
    词频统计
    基于HTTP的直播点播HLS
  • 原文地址:https://www.cnblogs.com/-sunshine/p/3335217.html
Copyright © 2011-2022 走看看