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; }