欧拉公式,求解小于某数且与该数互质的数的个数

来源:互联网 发布:淘宝千人千面 刷单 编辑:程序博客网 时间:2024/05/21 06:35


 

欧拉函数把n分解质因数=p1^(a1)*p2^(a2)……pn^(an)则小于n且与n互质的数的个数Φ=p1^(a1-1)*(p1-1)*p2^(a2-1)*(p2-1)……pn^(an-1)*(pn-1)
int eular(int n){int ret=1,i;for (i=2;i*i<=n;i++)if (n%i==0){n/=i,ret*=i-1;while (n%i==0)n/=i,ret*=i;}if (n>1)ret*=n-1;return ret;}


 

#include <stdlib.h>#include<stdio.h>#define N 50000int main(){    int *phi,i,j;    char *prime;    prime=(char*)malloc((N+1)*sizeof(char));    prime[0]=prime[1]=0;    for(i=2;i<=N;i++)        prime[i]=1;    for(i=2;i*i<=N;i++)    {        if(prime[i])        {            for(j=i*i;j<=N;j+=i)                prime[j]=0;        }    } //这段求出了N内的所有素数     phi=(int*)malloc((N+1)*sizeof(int));    for(i=1;i<=N;i++)        phi[i]=i;    for(i=2;i<=N;i++)    {        if(prime[i])        {            for(j=i;j<=N;j+=i)                phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出        }    } int t; scanf("%d",&t); while(t--){  int sum=0;  int n;  scanf("%d",&n);  for(i=1;i<=n;i++){   sum+=phi[i];  }   printf("%d\n",sum-1); }    return 0;}