2^x mod n = 1&&http://acm.hdu.edu.cn/showproblem.php?pid=1395
2012-07-10 18:25
549 查看
[align=left]Problem Description[/align]
Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
[align=left]Input[/align]
One positive integer on each line, the value of n.
[align=left]Output[/align]
If the minimum x exists, print a line with 2^x mod n = 1.
Print 2^? mod n = 1 otherwise.
You should replace x and n with specific numbers.
[align=left]Sample Input[/align]
2
5
[align=left]Sample Output[/align]
2^? mod 2 = 1
2^4 mod 5 = 1
思路:由欧拉定理可知当gcd(a,n)=1时,有a^φ(n) ≡ 1 (mod n),要想存在x首先要保证n和2互质,然后枚举该欧拉函数的因子即可。其中费小马定理是欧拉定理的一个特例,
a^p=p(mod n).
AC代码:
Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
[align=left]Input[/align]
One positive integer on each line, the value of n.
[align=left]Output[/align]
If the minimum x exists, print a line with 2^x mod n = 1.
Print 2^? mod n = 1 otherwise.
You should replace x and n with specific numbers.
[align=left]Sample Input[/align]
2
5
[align=left]Sample Output[/align]
2^? mod 2 = 1
2^4 mod 5 = 1
思路:由欧拉定理可知当gcd(a,n)=1时,有a^φ(n) ≡ 1 (mod n),要想存在x首先要保证n和2互质,然后枚举该欧拉函数的因子即可。其中费小马定理是欧拉定理的一个特例,
a^p=p(mod n).
AC代码:
#include<iostream> #include<string.h> #include<string> #include<cstdio> #include<cmath> using namespace std; int Euler(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) break; } if(n>1) ans=ans/n*(n-1); return ans; } bool is_pow(int m,int n) { int ans=1,res=2; while(m) { if(m&1) ans=(ans*res)%n; res=(res*res)%n; m=m>>1; } return ans==1; } int main() { int n; while(~scanf("%d",&n)) { if((n&1)==0||n==1) { printf("2^? mod %d = 1\n",n); } else { int m=Euler(n),ans; for(int i=2;;++i) if(m%i==0&&is_pow(i,n)) { ans=i;break; } printf("2^%d mod %d = 1\n",ans,n); } }return 0; }
相关文章推荐
- http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1004&ojid=1&cid=6866&hide=1&problem=Pro
- http://acm.hdu.edu.cn/showproblem.php?pid=1171&&0-1&&多重背包混合
- http://acm.hdu.edu.cn/showproblem.php?pid=2256&&构造矩阵求值
- Red and Black&&http://acm.hdu.edu.cn/showproblem.php?pid=1312
- Hello Kiki&&http://acm.hdu.edu.cn/showproblem.php?pid=3579
- http://acm.hdu.edu.cn/showproblem.php?pid=1075&&字典树
- http://acm.hdu.edu.cn/showproblem.php?pid=2852&&树状数组+二分
- http://acm.hdu.edu.cn/showproblem.php?pid=3544&&Alice's Game
- http://acm.hdu.edu.cn/showproblem.php?pid=3342&&拓扑入门题
- http://acm.hdu.edu.cn/showproblem.php?pid=3308&&线段树之区间合并
- http://acm.hdu.edu.cn/showproblem.php?pid=3591&&背包问题
- http://acm.hdu.edu.cn/showproblem.php?pid=2844&&背包问题
- Robberies&&http://acm.hdu.edu.cn/showproblem.php?pid=2955
- http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=791&pid=1001&ojid=0
- Least Common Multiple&&http://acm.hdu.edu.cn/showproblem.php?pid=1019
- http://acm.hdu.edu.cn/showproblem.php?pid=4337&&dfs
- http://acm.hdu.edu.cn/showproblem.php?pid=2845&&最大不连续数和
- http://acm.hdu.edu.cn/showproblem.php?pid=1892&&二维树状数组
- http://acm.hdu.edu.cn/showproblem.php?pid=2492&&求长度为3的顺序序列有多少个
- Clairewd’s message&&http://acm.hdu.edu.cn/showproblem.php?pid=4300