hdu1576 A/B 扩展欧几里德算法

来源:互联网 发布:sql语句中系统时间 编辑:程序博客网 时间:2024/06/07 08:08
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

Sample Output

n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n,x=(x%9973+9973)%9973。
#include<iostream>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>using namespace std;void extentgcd(int a,int b,int &x,int &y){    if(!b)    {        x=1;        y=0;    }    else    {        extentgcd(b,a%b,y,x);        y-=x*(a/b);    }}int main(){    int T;    cin>>T;    for(int i=1;i<=T;i++)    {        int n,b;        cin>>n>>b;        int x,y;        extentgcd(b,9973,x,y);        x=x*n;        x=(x%9973+9973)%9973;//为了防止x为负数        cout<<x<<endl;    }    return 0;}

拓展欧几里德模板
void extentgcd(int a,int b,int &x,int &y)//ax+by=gcd(a,b)中x,y的值{    if(!b)    {        x=1;        y=0;    }    else    {        extentgcd(b,a%b,y,x);        y-=x*(a/b);    }

注意:对于a*x+b*y=c;cgcd(a,b)的倍数时才有解

x=(x%9973+9973)%9973可以这样处理得到非负最小的x

y=(c-a*x)/b;



0 0