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

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;



你可能感兴趣的:(gcd,数论-拓展欧几里德算法)