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;

}


 

 

你可能感兴趣的:(function)