题目链接:HDU 1576 A/B
中文题,
思路:设X=(A/B)%9973。A/B=k_1*9973+X。A=B*k_1*9973+x*B。n=A%9973,A=k_2*9973+n。k_2*9973+n=B*k_1*9973+x*B
B*X ≡ n mod 9973 就是转化为 求B关于n模9973 的逆元。gcd(B,9973) = 1 得知一定有解。
AC代码:
#include<stdio.h> #define ll __int64 ll exgcd(ll a,ll b,ll &x,ll &y) { if(b==0) { x=1; y=0; return a; } ll ans=exgcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; return ans; } // a*x=c mod b ll cal(ll a,ll b,ll c) { ll x,y; ll gcd=exgcd(a,b,x,y); while(x<0) { x+=b; y-=a; } if(c%gcd!=0) return -1; x*=c/gcd; b=b<0? -b:b; ll ans=x%b; if(ans<=0) ans+b; return ans; } int main() { ll t; ll n,b; while(scanf("%I64d",&t)!=EOF) { while(t--) { scanf("%I64d %I64d",&n,&b);//gcd(B,9973) = 1 有解 printf("%I64d\n",cal(b,9973,n)); } } return 0; }
时间: 2024-10-06 19:14:14