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
Print 2^? mod n = 1 otherwise.
You should replace x and n with specific numbers.
解題思路:此題運用到了歐拉定理。同餘定理。
歐拉定理:若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;
}