- 原题链接: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; }
07-28