HDU 1576 A/B (扩展欧几里得应用)
2014-09-25 16:19
127 查看
题目链接: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代码:
中文题,
思路:设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; }
相关文章推荐
- hdu1576 A/B 扩展欧几里得求逆元
- hdu 1576(数论之扩展欧几里得)
- HDU 1576 A/B 扩展欧几里得
- hdu 1576 扩展欧几里得
- hdu 1576 A/B(扩展欧几里得)
- HDU 1576 A/B(欧几里得扩展)
- 扩展欧几里得算法的应用 POJ 2115 POJ 2142 POJ 1061 HDU 2669 HDU 1576 SGU 106
- hdu1576(A/B)扩展欧几里得
- hdu 1576 A/B (求乘法逆元——扩展欧几里得)
- HDU 1576 扩展欧几里得
- hdu 1576 扩展欧几里得
- HDU 1576 A/B 扩展欧几里得
- HDU 1576 A/B 暴力也能过。扩展欧几里得
- HDU - 1576 - A/B (扩展欧几里得定理)
- hdu 1576A/B(扩展欧几里得)
- HDU 1576 A/B (逆元求扩展欧几里得)
- 数论-hdu-1576-A/B-逆元-扩展欧几里得
- HDU 1576 A/B (扩展欧几里得)
- 【HDU】1576 - A/B(扩展欧几里得)
- hdu_1576A/B(扩展欧几里得求逆元)