HDU 1395 2^x mod n = 1【數學】

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


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
 


 

Author
MA, Xiao
 


 

Source

 

 

解題思路:此題運用到了歐拉定理。同餘定理。

                    歐拉定理:若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;
}


 

 

                           
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章