POJ 1284 原根(欧拉函数)
2016-09-27 18:30
302 查看
时空隧道
题目大意:
给出奇素数n,求出n的原根的个数
分析:
暑假没好好听课QAQ…不得不去百度了一发原根是什么…
假设n的原根为x,那么x满足以下性质:
x^1modn与x^2modn与……x^phi(n)modn的ans互不相同
对于此题,题目中规定n是一个奇素数,所以n一定是有原根的(证明自行百度吧233)
接下来介绍一个定理:
n的原根个数=phi(phi(n))
因为n是奇素数所以phi(n)=n-1
所以ans=phi(n-1)
代码如下:
by >_< NeighThorn
题目大意:
给出奇素数n,求出n的原根的个数
分析:
暑假没好好听课QAQ…不得不去百度了一发原根是什么…
假设n的原根为x,那么x满足以下性质:
x^1modn与x^2modn与……x^phi(n)modn的ans互不相同
对于此题,题目中规定n是一个奇素数,所以n一定是有原根的(证明自行百度吧233)
接下来介绍一个定理:
n的原根个数=phi(phi(n))
因为n是奇素数所以phi(n)=n-1
所以ans=phi(n-1)
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn using namespace std; const int maxn=65536+5; int n,phi[maxn],prime[maxn],vis[maxn],cnt; signed main(void){ memset(vis,0,sizeof(vis)),cnt=0; for(int i=2;i<=65536;i++){ if(!vis[i]) prime[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt&&prime[j]*i<=65536;j++){ vis[prime[j]*i]=1; if(i%prime[j]==0){ phi[i*prime[j]]=prime[j]*phi[i]; break; } else phi[i*prime[j]]=(prime[j]-1)*phi[i]; } } while(scanf("%d",&n)!=EOF) cout<<phi[n-1]<<endl; return 0; }
by >_< NeighThorn
相关文章推荐
- poj 1284 Primitive Roots(原根+欧拉函数)
- POJ1284:Primitive Roots(欧拉函数的应用,奇素数的原根)
- POJ1284 Primitive Roots (欧拉函数 & 原根)
- POJ 1284 Primitive Roots (欧拉函数&原根定理)
- poj1284 Primitive Roots(原根,欧拉函数)
- POJ 1284 - Primitive Roots (原根 + 欧拉函数)
- POJ 1284 Primitive Roots (原根,欧拉函数)
- poj-1284(欧拉函数+原根)
- poj 1284 Primitive Roots(原根+欧拉函数)
- poj 1284 欧拉函数的运用
- POJ1284_Primitive Roots【欧拉函数】
- poj 1284 Primitive Roots (原根)
- POJ 1284 Primitive Roots(欧拉函数)
- POJ-1284 Primitive Roots 欧拉函数
- Primitive Roots POJ - 1284 原根, 欧拉函数
- POJ 1284 : Primitive Roots - 欧拉函数,原根
- 原根个数(poj 1284)
- POJ1284 Primitive Roots【原根】
- [POJ1284]Primitive Roots(原根性质的应用)
- POJ 1284 Primitive Roots 解题报告(欧拉函数)