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求出可能是负数。
代码:
思路:求 (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; }
相关文章推荐
- 数论-hdu-1576-A/B-逆元-扩展欧几里得
- HDU 1576 A/B(数论-简单逆元)
- HDU 1576 A/B(数论简单题,求逆元)
- hdu1576 mod 运算的逆元
- hdu 1576 A/B (求逆元)
- hdu 1576 A/B 求逆元模板题
- 扩展欧几里得,逆元初识(poj 1061+codeforce 7C line+hdu 1576 A/B)
- HDU 1576 A/B (逆元求扩展欧几里得)
- 【数论】HDU 1576
- hdu1576 A/B 扩展欧几里得求逆元
- hdu 1576(逆元)
- HDU-1576 A/B 【逆元模板题】
- hdu 5407 CRB and Candies(数论,LCM,快速幂取模,求逆元)
- HDU 3240 Counting Binary Trees(组合数学-卡特兰数,数论-整数快速幂,数论-求逆元)
- HDU 1576 A/B(数论)
- HDU 1576 A/B (扩展欧几里得求逆元)
- HDU 3240 Counting Binary Trees(组合数学-卡特兰数,数论-整数快速幂,数论-求逆元)
- hdu 1576 A/B || hdu 2669 Romantic (数论--欧几里德)
- HDU 5698 瞬间移动 [数论] [逆元] [组合数取模]
- HDU 1576 乘法逆元