hdu 1576(拓展欧几里得)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1576(拓展欧几里得)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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 數(shù)據(jù)的第一行是一個(gè)T,表示有T組數(shù)據(jù)。
每組數(shù)據(jù)有兩個(gè)數(shù)n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output 對(duì)應(yīng)每組數(shù)據(jù)輸出(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,兩邊同時(shí)模上9973,A%9973=kB%9973,又因?yàn)锳%9973=n,所以kB%9973=n,則kB=n+9973y,兩邊同時(shí)除以n,(k/n)B+(-y/n)9973=gcd(B,9973)=1,這正好就是拓展歐幾里得算法的標(biāo)準(zhǔn)形式了,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),和對(duì)應(yīng)的ax+by=d中的x,y {if(a == 0 && b == 0) return -1; //無最大公約數(shù)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; }
總結(jié)
以上是生活随笔為你收集整理的hdu 1576(拓展欧几里得)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj 734
- 下一篇: UI标签库专题十三:JEECG智能开发平