您的位置:首页 > 其它

A/B 扩展gcd(或逆元)

2015-05-07 22:55 211 查看
                                A/B

题目抽象:给出n,B. n=A%9973,gcd(B,9973)=1. 求(A/B)%9973.思路:A是未给出的量,需要用其他量来表示它。设A/B=x,即A=B*x; y=A/9973.


n=A-A/9973*9973=B*x-9973*y=n;(**) 。

gcd(B,9973)=1=B*x1+9973*y1;(*)

将(*)左右两边乘以n 得到 B*(n*x1)-9973*(-n*y1)=n;只需求出x1就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

void ex_gcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
x=1;y=0;d=a;
}
else
{
ex_gcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}

int main()
{
int T,b,n;
int x,y,d;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&b);
ex_gcd(b,9973,d,x,y);
x*=n;               //  x可能为负数
printf("%d\n",(x%9973+9973)%9973);
}
return 0;
}


知道逆元的同学就很容易发现这是一个赤裸裸得逆元问题。现在用逆元来水过。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int mod=9973;

void ex_gcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
x=1;y=0;d=a;
}
else
{
ex_gcd(b,a%b,d,y,x);
y-=(a/b)*x;
}
}

int main()
{
int T,n,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&b);
int d,x,y;
ex_gcd(b,mod,d,x,y);
x=(x%mod+mod)%mod;   //  x可能为负数
printf("%d\n",n*x%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: