hdu 2824 The Euler function(欧拉函数)

如果打表的话会超内存,我想到了一种方法解决这个问题。题目给出的数据时3000000,我将三百万分成300个数据,将整万的数据存储下来,计算的时候,先计算x和y之间整万的数据,然后再计算零散数据。

想法很不错,但为啥就是通不过呢?而且看提交返回的时间来看,应该是卡在最后一两组数据上了。

我很疑惑。

代码中注释的部分是我之前的代码。最后这道题竟然是毫无美感的暴力过去了。

 

#include<stdio.h>
#include<string.h>
#define N 3000005
int a[N];
int b[N];
__int64 c[310];
int main()
{
    int i,j;
    for(i=2;i<N;i++)
        a[i]=i;
    for(i=2;i<N;i++)
    {
        if(b[i]==1)
            continue;
        a[i]=i-1;
        for(j=i+i;j<N;j=j+i)
        {
            b[j]=1;
            a[j]=a[j]/i*(i-1);
        }
    }
    a[1]=a[0]=0;
    c[1]=0;
    __int64 temp;
    c[0]=0;
    j=1;
    temp=0;
    for(i=2;i<N;i++)
    {
        temp+=a[i];
        if(i%10000==0)
            c[j++]=temp;
    }
    int x,y;
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        __int64 sum=0;
        /*
        int x1,y1;
        x1=x/10000;
        y1=y/10000;
        if(x1==y1)
        {
            for(i=x;i<=y;i++)
                sum+=a[i];
        }
        else
        {
            sum+=c[y1]-c[x1];
            for(i=x1*10000+1;i<x;i++)
                sum-=a[i];
            for(i=y1*10000+1;i<=y;i++)
                sum+=a[i];
        }
        */
        for(i=x;i<=y;i++)
            sum+=a[i];
        printf("%I64d\n",sum);
    }
    return 0;
}


 

 

posted @ 2013-07-09 16:01  爱生活,爱编程  阅读(226)  评论(0编辑  收藏  举报