1. 程式人生 > >HDU 1576 A/B(歐幾裏德算法延伸)

HDU 1576 A/B(歐幾裏德算法延伸)

acm printf code can std 計算 可能 註意 tput

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=1576

題目:

Problem Description 要求(A/B)%9973,但由於A很大,我們只給出n(n=A%9973)(我們給定的A必能被B整除,且gcd(B,9973) = 1)。

Input 數據的第一行是一個T,表示有T組數據。
每組數據有兩個數n(0 <= n < 9973)和B(1 <= B <= 10^9)。

Output 對應每組數據輸出(A/B)%9973。

Sample Input 2 1000 53 87 123456789 Sample Output 7922 6060
 1
/* 2 問題 3 給出n(0 <= n < 9973)和B(1 <= B <= 10^9),計算(A/B)%9973 4 其中n=A%9973,A必能被B整除,且gcd(B,9973) = 1 5 6 解題思路 7 設X=(A/B)%9973,則A/B=K*9973+X(K為正整數) 8 即A=K*9973*B+X*B 9 10 又n=A%9973,則A=p*9973+n 11 12 結合兩式可得 p*9973+n=K*9973*B+X*B 13 移項可得 p*9973-K*9973*B=X*B-n 14 即9973*(p-K*B)=X*B-n 15 顯然左邊對9973取余等於0,那麽0=(X*B-n)%9973
16 此時直接枚舉X取值即可,另外註意到X*B可能對超出int範圍,需要用到同余運算,當然直接將其轉換為long long類型也可。 17 (a-b)%n=((a%n)-(b%n)+n)%n 18 (a*b)%n=(a%n)*(b%n)%n 19 故(x*B-n)%9973=( ((X%9973)*(B%9973)%9973) -(n%9973)+9973 )%9973 20 */ 21 22 #include<cstdio> 23 24 int main() 25 { 26 int t,n,X; 27 long long B; 28 scanf("%d"
,&t); 29 while(t--){ 30 scanf("%d%lld",&n,&B); 31 for(X=0;;X++){ 32 if((((X%9973)*(B%9973)%9973) - (n%9973)+9973)%9973 == 0){ 33 printf("%d\n",X); 34 break; 35 } 36 } 37 } 38 return 0; 39 } 40

HDU 1576 A/B(歐幾裏德算法延伸)