您的位置:首页 > 其它

HDU 1576 A/B (数论逆元)

2017-01-21 18:32 393 查看
原题链接:Here!

思路:求 (A/B)%9973 的值 ,给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。

n=A%9973  -> n=A-A/9973*9973

因为B|A ,设A/B=x ,A=Bx,则 Bx-9973y=n

又因gcd(B,9973)=1=Bx1+9973y1 ,方程两边同乘n可得, Bnx1+9973ny1=n

x=A/B , ans=x%9973,只需要求出x则能得到ans

可以看出红色方程是相等的,即x==nx1,即求出x1即能得到答案

用拓展欧几里德求出x1,需要注意x求出可能是负数。

代码:
#include<bits/stdc++.h>
using namespace std;

const int mod = 9973;

void exgcd(int a,int b,int &x,int &y){
if(b==0){ x=1;	y=0; return; }
exgcd(b,a%b,x,y);
int tmp = x;
x = y;	 y = tmp-a/b*y;
}

int main(){
int T,n,b,x,y;
cin>>T;
while(T--){
cin>>n>>b;
exgcd(b,mod,x,y);
x *= n;
cout<< (x%mod+mod)%mod <<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: