您的位置:首页 > 其它

HDU 1395 2^x mod n = 1【数学】

2014-07-31 15:00 399 查看

2^x mod n = 1

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

Total Submission(s): 11776 Accepted Submission(s): 3665



[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


[align=left]Author[/align]
MA, Xiao

[align=left]Source[/align]
ZOJ Monthly, February 2003

解题思路:此题运用到了欧拉定理。同余定理。

欧拉定理:若a,n为正整数,且a,n互质,则 a^x≡1(mod n)

在这里道题里: 2^x mod n = 1 求2的x次方对n取余等于1

①当n==1时,2^x mod 1 ≡ 0,所以排除n==1的情况。

②当n==偶数时,2^x 与 n 不会互质,2^x mod n ≠ 1,2^x对n取余都不会等于1,所以排除n==偶数的情况。

③当n==奇数时,2^x与n互质,即存在一个x使得2^x mod n = 1

解决问题的关键在于如何找到x

我们可以列举,当n=3时, 2^2 mod 3 =1

当n=5时, 2^4 mod 5 =1

当n=7时, 2^3 mod 7 =1

我们可以直接暴力求2的x次方,直到2^x mod n = 1

y=1;
for(x=1;;x++)
{
y=y*2;
y=y%n;				//同余定理
if(y==1)
break;
}

通过一个将y初始化为1,通过一个for循环,

x初始化为1,每次循环表示2的x次方。

这里运用到了同余定理。

同余定理:(a*b)%c==((a%c)*(b%c))%c

y=y*2每一次都对n取余,与y^x 对n取余结果相等。

以n==5为例,2^4 mod 5==1,

2^4 mod 5 == ((2%5)*(2%5)*(2%5)*(2%5))%5

上式=(2^3 * 2) % 5 = ( 8 * 2 ) % 5 = ( (8%5) * (2%5) ) %5 = ( 3 * 2 )%5 = 6 % 5 =1

当x=1时,y=2^1=2, y%n =2%5=2

当x=2时,y=2*2=4,y%n =4%5=4

当x=3时,y=4*2=8,y%n =8%5=3

当x=4时,y=3*2=6,y%n =6%5=1

2^4==16,16%5==1 结果相等。

直到y==1,即余数等于1时,跳出循环,输出y的x次方。

AC码

#include<stdio.h>
int main()
{
int n,x,y;
while(scanf("%d",&n)==1)
{
if(n%2==0||n==1)
printf("2^? mod %d = 1\n",n);
else
{
y=1;
for(x=1;;x++)
{
y=y*2;
y=y%n;				//同余定理
if(y==1)
break;
}
printf("2^%d mod %d = 1\n",x,n);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: