标签:add clu uri 正整数 test java inpu data- pad
3 4 0
0 2
对正整数n。欧拉函数是少于或等于n的数中与n互质的数的数目。比如euler(8)=4,由于1,3,5,7均和8互质。
Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),当中p1,p2……pn为x的全部素因数。x是不为0的整数。
euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:一个数的全部质因子之和是euler(n)*n/2。
那么怎样变成实现欧拉函数呢?以下通过两种不同的方法来实现。
第一种方法是直接依据定义来实现。同一时候第一种方法也是另外一种筛法的基础,当好好理解。
//直接求解欧拉函数 int euler(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } //筛选法打欧拉函数表 #define Max 1000001 int euler[Max]; void Init(){ euler[1]=1; for(int i=2;i<Max;i++) euler[i]=i; for(int i=2;i<Max;i++) if(euler[i]==i) for(int j=i;j<Max;j+=i) euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 }附ac代码:
#include<stdio.h> int ac(__int64 n) { int res=n; int a=n; for(int i=2;i*i<=a;i++) { if(a%i==0) res=res/i*(i-1); while(a%i==0) a/=i; } if(a>1) res=res/a*(a-1); return res; } int main() { __int64 n,m; while(scanf("%I64d",&n),n) { if(n==1) printf("0\n"); else { __int64 res=ac(n); m=((n-1)*n/2-n*res/2)%1000000007;//求和公式 printf("%I64d\n",m); } } return 0; }
标签:add clu uri 正整数 test java inpu data- pad
原文地址:http://www.cnblogs.com/liguangsunls/p/6916061.html