您的位置:首页 > 其它

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

2016-03-05 23:05 387 查看
[align=left]Problem Description[/align]
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

[align=left]Input[/align]
数据的第一行是一个T,表示有T组数据。

每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。

[align=left]Output[/align]
对应每组数据输出(A/B)%9973。

[align=left]Sample Input[/align]

[align=left]Sample Output[/align]

[align=left]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。[/align]
#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;当c是gcd(a,b)的倍数时才有解

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

y=(c-a*x)/b;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: