2017.8.28. 欧拉函数

来源:互联网 发布:自动抢红包软件 编辑:程序博客网 时间:2024/06/13 23:44

欧拉函数

适用范围:求与一个或者连续几个数互质的数的个数,也可以反过来求与其不互质的书的个数。

PS:信欧拉,得永生。
PS:第二段的代码我还没调好各位先别用。

std.cpp(求单个数)

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<iomanip>#include<algorithm>#include<string>#include<cstring>#include<queue>using namespace std;//求所有与该数互质的数的个数 int getphi(int n){    int m=sqrt(n+0.5);    int ans=n;    for(int i=2;i<=m;i++)      if(n%i==0)      {        ans = ans/i*(i-1);        while(n%i==0)          n/=i;      }    if(n>1)ans=ans/n*(n-1);    return ans;}int main(){    int n;    cin >> n;   cout << getphi(n) << endl;}

std.cpp(求1~n)

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<iomanip>#include<algorithm>#include<string>#include<cstring>#include<queue>using namespace std;//求所有与该数互质的数的个数 int tot=0,phi[10000007],prime[10000007];bool check[10000007];void euler(int n){    memset(check,false,sizeof check);    phi[1] = 1;    for(int i=2;i<=n;i++)     {        if(!check[i])        {            prime[tot++] = i;            phi[i] = i-1;        }        for(int j=0;j<tot;j++)        {            if(i*phi[i]>n) break;            check[i*phi[i]] = 1;            if(i%prime[j]==0)            {                phi[i*prime[j]] = phi[i]*prime[j];                break;            }            else phi[i*prime[j]] = phi[i]*(prime[j]-1);        }    } }int main(){    int n;    cin >> n;       euler(n);    for(int i=1;i<=n;i++)cout<<phi[i]<<endl;}