原根
来源:互联网 发布:淘宝店群模式靠谱吗 编辑:程序博客网 时间:2024/06/09 22:54
1135 . 原根
时间限制:1 秒 空间限制:65536 KB 分值: 0
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
给出1个质数P,找出P最小的原根。
Input
输入1个质数P(3 <= P <= 10^9)
Output
输出P最小的原根。
直接应用上一篇博文的结论即可。
#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxn = 100000+10;typedef long long LL;bool prime[maxn];int prim[maxn],k;void make_prime(){ memset(prime,0,sizeof(prime)); k=0; for(int i=2;i<maxn;i++) if(!prime[i]){ prim[k++]=i; for(int j=0;j<k&&prim[j]<maxn/i;j++) { prime[i*prim[j]]=1; if(i%prim[j]==0) break; } }}int fac[50],num;void divide(LL n){ num=0; for(int i=0;prim[i]*prim[i]<=n;i++) if(n%prim[i]==0){ fac[num++]=prim[i]; while(n%prim[i]==0) n/=prim[i]; } if(n>1) fac[num++]=n;}LL pow_mod(LL a,LL b,LL mod){ LL r=1; while(b) { if(b&1) r=r*a%mod; a=a*a%mod; b>>=1; } return r;}int main(){ LL p; make_prime(); while(cin>>p) { divide(p-1); for(int i=2;i<p;i++) { bool flag=true; for(int j=0;j<num;j++) { int x=(p-1)/fac[j]; if(pow_mod(i,x,p)==1){ flag=false; break; } } if(flag){ printf("%d\n",i); break; } } } return 0;}
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 原根
- 指针和引用遇到的两个问题
- CUDA编程开发一周问题集锦
- Linux_arm驱动之按键模拟脉冲实现定时器的精确计时 (实例)
- NetApp clustered ONTAP Monitor 示例,太棒了!
- 将得到的路径的单斜线替换为双斜线
- 原根
- 黑马程序员--C#数据类型运算符
- 参加第二届“中国软件杯”全国大学生软件设计大赛三等奖——超级记事本,大家可以试用一下,提出宝贵意见
- 链表的相交与环问题
- Unity利用NGUI实现自定义鼠标
- C#采集CSDN单个博客所有文章
- BeginInvoke和EndInvoke方法
- hdu 4725
- char* m_strcat(char* dst, char* src);