Problem Description
Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
Input
One positive integer on each line, the value of n.
Output
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.
Print 2^? mod n = 1 otherwise.
You should replace x and n with specific numbers.
Sample Input
2 5
Sample Output
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;
}