首页 > 代码库 > HDU 1576 A/B (扩展欧几里得应用)
HDU 1576 A/B (扩展欧几里得应用)
题目链接: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; }
HDU 1576 A/B (扩展欧几里得应用)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。