您的位置:首页 > 理论基础 > 计算机网络

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代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  integer output input each