您的位置:首页 > 其它

hdu 1395 2^x mod n = 1

2014-07-31 22:57 381 查看
hdu 1395 2^x mod n = 1

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 11835 Accepted Submission(s): 3684

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.



Sample Input

2

5



Sample Output

2^? mod 2 = 1

2^4 mod 5 = 1

/*

方法一:暴力搜索 + 同余定理

*/

#include<cstdio>

int main()

{

int m,n,t;

while(scanf("%d",&n)!=EOF)

{

m=n%2?2:0;

t=1;

while(m!=1&&m)

{

m=m*2;

m%=n;

t++;

}

if(n%2==0||n==1) printf("2^? mod %d = 1\n",n);

else printf("2^%d mod %d = 1\n",t,n);

}

return 0;

}

/*

方法二: 蒙哥马利幂模运算

*/

#include<cstdio>

int Montgomery(long long a,int b,int c)

{

long long ans=1;

while(b)

{

if(b&1)

ans=(ans*a)%c;

b>>=1;

a=(a*a)%c;

}

return ans;

}

int main()

{

int m,i;

while(scanf("%d",&m)!=EOF)

{

if(m%2==0||m<=1) //如果不加 m<=1 会出现 TLE .

printf("2^? mod %d = 1\n",m);

else

for(i=1; ; i++)

{

if(Montgomery(2,i,m)==1)

{

printf("2^%d mod %d = 1\n",i,m);

break;

}

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: