折腾了一晚上很水的数论,整个人都萌萌哒
主要看了欧拉筛和素数筛的O(n)的算法
这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解
http://blog.csdn.net/lerenceray/article/details/12420725
代码如下
1 void ES(){ 2 for(int i=2;i<n;i++){ 3 if (!pd[i]){ 4 prime[++top]=i; 5 phi[i]=i-1; 6 } 7 for (int j=1;j<=top&&prime[j]*i<=n;j++){ 8 pd[prime[j]*i]=1; 9 if (i%prime[j]==0){ 10 phi[prime[j]*i]=phi[i]*prime[j]; 11 break; 12 } 13 phi[prime[j]*i]=phi[i]*(prime[j]-1); 14 } 15 } 16 }