hdu 1576(拓展欧几里得)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                hdu 1576(拓展欧几里得)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                A/B
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)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解題思路:令(A/B)%9973=k,則A/B=k+9973x(x未知),A=kB+9973xB,兩邊同時模上9973,A%9973=kB%9973,又因為A%9973=n,所以kB%9973=n,則kB=n+9973y,兩邊同時除以n,(k/n)B+(-y/n)9973=gcd(B,9973)=1,這正好就是拓展歐幾里得算法的標準形式了,k/n等于x,(-y/n)等于y,最后還要乘上n。。拓展歐幾里得算法常用在解模線性方程及方程組中。AC:#include<iostream> #include<cstdio> using namespace std;const int mod = 9973; int extend_gcd(int a,int b,int &x,int &y) //返回d=gcd(a,b),和對應的ax+by=d中的x,y {if(a == 0 && b == 0) return -1; //無最大公約數if(b == 0){x = 1, y = 0;return a;}int d = extend_gcd(b,a%b,y,x);y = y - a/b*x;return d; }int main() { int t,n,b;scanf("%d",&t);while(t--){int x,y;scanf("%d%d",&n,&b);extend_gcd(b,mod,x,y);printf("%d\n",n*x%mod+mod);}return 0; }
總結
以上是生活随笔為你收集整理的hdu 1576(拓展欧几里得)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: nyoj 734
 - 下一篇: UI标签库专题十三:JEECG智能开发平