欧拉函数

来源:互联网 发布:网上数据库参考文献 编辑:程序博客网 时间:2024/05/16 00:38

欧拉函数模板

int oula(int n){int i,ans=n;for(i=2;i*i<=n;i++){if(n%i==0)ans=ans-ans/i;while(n%i==0)n/=i;}if(n>1)ans=ans-ans/n;return ans;}
欧拉函数打表

void table(){int i,j;for(i=2;i<=N;i++)p[i]=0;p[1]=1;for(i=2;i<=N;i++){if(p[i]==0)for(j=i;j<=N;j+=i){if(p[j]==0)p[j]=j;p[j]=p[j]/i*(i-1);}}}poj 2478思路:给定一个数n,求在[1,n]这个范围内两两互质的组合数。则问题可以转化为给定一个数n,比n小且与n互质的数的个数。这个就是典型的欧拉函数问题了。点击打开链接
#include<iostream>#include <string.h>#include<cstdio>#include<cstdlib>#define N 1000009using namespace std;int p[N],a[N];void table(){int i,j;for(i=2;i<=N;i++)p[i]=0;p[1]=1;for(i=2;i<=N;i++){if(p[i]==0)for(j=i;j<=N;j+=i){if(p[j]==0)p[j]=j;p[j]=p[j]/i*(i-1);}}}int main(){int n,y,i;long long t;//注意要用long longtable();while(scanf("%d",&n)&&n){t=0;for(i=2;i<=n;i++)t+=p[i];printf("%lld\n",t);}return 0;}

poj 1284

题目大意就是给出一个奇素数,求出他的原根的个数,定义n的原根x满足条件0<x<n,并且有集合{ (xi mod n) | 1 <= i <=n-1 } 和集合{ 1, ..., n-1 }相等

如果知道欧拉函数的话,看出的答案是p(n-1)其实也不难

定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根点击打开链接
<span style="font-family:SimHei;color:#000000;">#include<iostream>#include <string.h>#include<cstdio>#include<cstdlib>#define N 1000009using namespace std;int p[N];void table(){int i,j;for(i=2;i<=N;i++)p[i]=0;p[1]=1;for(i=2;i<=N;i++)if(p[i]==0)for(j=i;j<=N;j+=i){if(p[j]==0)p[j]=j;p[j]=p[j]/i*(i-1);}}int main(){int n,y,i;table();while(scanf("%d",&n)!=EOF){printf("%d\n",p[n-1]);}return 0;}</span>
poj 2407
题目大意就是给一个数n,求出不大于n且与n互素的数的个数,
这就是简单的欧拉函数的运用
点击打开链接
#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int oula(int n){int i,ans=n;for(i=2;i*i<=n;i++){if(n%i==0)ans=ans-ans/i;while(n%i==0)n/=i;}if(n>1)ans=ans-ans/n;return ans;}int main(){int n,ans,i;while(scanf("%d",&n)&&n){ans=oula(n);printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击