XTUOJ 1140 Anti-Goldbach's Conjecture(数论)


XTUOJ 1140 Anti-Goldbach's Conjecture(数论)_第1张图片

昨天晚上我们进行了第一次小组赛,做的是12年的湘潭市比赛的题,我们队只ac了两个题,做这次题的时候,感觉是挺简单的,我们就开始着手做,提交了好几次都是TLE,后面就基本一直在搞这个题,对这个题进行优化,一直到最后,我们还是没能ac。。程序的优化真的很重要啊,特别是比赛的时候,在选对算法后,还要对算法进行一定的优化,在一次一次的优化后,找到更加好的方法,这才是算法的魅力所在吧。今天早上在网上搜了一下其他大神的代码,仔细看了一下,其实思路和我们都差不多,有好多的细节的地方我们都没有处理好,看别人优化后的代码,提交了一下,才100多ms;参考了一下这篇博客http://blog.csdn.net/talak/article/details/7603432

开始我们想到的也是要打表,用筛选法,筛选法还是要基于题目进行优化啊!!

#include <stdio.h>
#define N 1000002
long long prime[N]={0};
long long count[N]={0};
int main()
{
    long long n,len=0;
    for(int i=2;i<=N/2;i++)  //这里就是对筛选法的优化,对于这个题目,我们选出奇合数就行了,(奇数=奇数+偶数)
      {
        for(int j=i+i;j<=N;j+=i)
          {
           if(j%2==1)
              prime[j]=1;
          }
      }
      for(int i=9;i<=N;i++) //题目要求n>=13,所以要从n-4的奇数开始(从9开始)
      {
          if(prime[i])
            len++;
          count[i+4]=len; //这个地方,我们要从4开始(满足题意,最少的偶合数是4)
      }
    while(scanf("%I64d",&n)!=EOF)
    {
        long long sum=0;
        for(int i=13;i<=n;i=i+2)//这里直接按照奇数输出,偶数就直接是前面一个奇数的值;
           sum+=count[i];
        printf("%I64d\n",sum);
    }
    return 0;
}

这里还要注意的是,不知道是湘大的系统问题还是其他问题,感觉湘大判题对lld有问题,开始这里输入输出用的是lld,提交上去是wa,后面改成I64d就ac了,这里以后还是要注意,感觉好像用I64d比lld要快那么一点,以后就用I64d吧,还有比赛的时候可能那个头文件也会出现错误,我平时都用的<>,好像比赛的时候用“”的范围更大,这个也还是注意一下吧。








你可能感兴趣的:(算法,优化,ACM)