【HDOJ】1395 -> 2^x mod n = 1
2013-08-18 21:33
267 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1395
心得:
欧拉定理: a^phi(m) ≡1(mod m),phi(m)为欧拉函数,表示比m小且与m互质的正整数个数,当m为质数时,phi(m)=m-1。即为费马定理。本题中:1、当n为1时无解。
2、当n为偶数时,2^x也为偶数,所以2^x不可能和n关于奇数1同余。 3、当n为素数时,根据费马定理x=n-1,但不一定最小。此时暴力即可。
小技巧:x*2%n先取模再乘2可以加快运算速度,即(x%2)*2。
代码:
#include <stdio.h>
int main(){
__int64 n,i,x;
while(~scanf("%I64d",&n)){
if(n==1 || n%2==0) printf("2^? mod %I64d = 1\n",n);
else{
x=1;i=0;
while(i++,1){
x=(x%n)*2;
if(x%n==1) break;
}
printf("2^%I64d mod %I64d = 1\n",i,n);
}
}
return 0;
}
心得:
欧拉定理: a^phi(m) ≡1(mod m),phi(m)为欧拉函数,表示比m小且与m互质的正整数个数,当m为质数时,phi(m)=m-1。即为费马定理。本题中:1、当n为1时无解。
2、当n为偶数时,2^x也为偶数,所以2^x不可能和n关于奇数1同余。 3、当n为素数时,根据费马定理x=n-1,但不一定最小。此时暴力即可。
小技巧:x*2%n先取模再乘2可以加快运算速度,即(x%2)*2。
代码:
#include <stdio.h>
int main(){
__int64 n,i,x;
while(~scanf("%I64d",&n)){
if(n==1 || n%2==0) printf("2^? mod %I64d = 1\n",n);
else{
x=1;i=0;
while(i++,1){
x=(x%n)*2;
if(x%n==1) break;
}
printf("2^%I64d mod %I64d = 1\n",i,n);
}
}
return 0;
}
相关文章推荐
- hdoj 1395 2^x mod n = 1
- HDOJ1395 2^x mod n = 1
- 2^x mod n = 1 hdoj 1395
- HDOJ 1395 2^x mod n = 1
- HDOJ 1395 2^x mod n = 1
- HDOJ 1395 2^x mod n = 1
- hdoj 1395 2^x mod n = 1 【暴力】
- HDOJ-1395-2^x mod n = 1 解题报告
- hdoj1395 2^x mod n = 1
- HDU/HDOJ 1395 ACM浙大月赛 2^x mod n = 1 可暴力 可用欧拉定理
- hdoj1395 (数学水题)2^x mod n = 1
- HDU/HDOJ 1395 ACM浙大月赛 2^x mod n = 1
- [HDOJ1395]2^x mod n = 1(欧拉函数)
- HDOJ 题目1395 2^x mod n = 1(水题 易错)
- hdoj-1395-2^x mod n = 1【欧拉定理】
- hdoj 1395 2^x mod n = 1 【暴力】
- 【HDOJ】1032 -> The 3n + 1 problem
- Oil Deposits<hdoj1241>
- 【HDOJ】1197 -> Specialized Four-Digit Numbers
- 【HDOJ】1235 -> 统计同成绩学生人数