A/B 扩展gcd(或逆元)
2015-05-07 22:55
211 查看
A/B
题目抽象:给出n,B. n=A%9973,gcd(B,9973)=1. 求(A/B)%9973.思路:A是未给出的量,需要用其他量来表示它。设A/B=x,即A=B*x; y=A/9973.
n=A-A/9973*9973=B*x-9973*y=n;(**) 。
gcd(B,9973)=1=B*x1+9973*y1;(*)
将(*)左右两边乘以n 得到 B*(n*x1)-9973*(-n*y1)=n;只需求出x1就可以了
知道逆元的同学就很容易发现这是一个赤裸裸得逆元问题。现在用逆元来水过。
题目抽象:给出n,B. n=A%9973,gcd(B,9973)=1. 求(A/B)%9973.思路:A是未给出的量,需要用其他量来表示它。设A/B=x,即A=B*x; y=A/9973.
n=A-A/9973*9973=B*x-9973*y=n;(**) 。
gcd(B,9973)=1=B*x1+9973*y1;(*)
将(*)左右两边乘以n 得到 B*(n*x1)-9973*(-n*y1)=n;只需求出x1就可以了
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; void ex_gcd(int a,int b,int &d,int &x,int &y) { if(b==0) { x=1;y=0;d=a; } else { ex_gcd(b,a%b,d,y,x); y-=(a/b)*x; } } int main() { int T,b,n; int x,y,d; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&b); ex_gcd(b,9973,d,x,y); x*=n; // x可能为负数 printf("%d\n",(x%9973+9973)%9973); } return 0; }
知道逆元的同学就很容易发现这是一个赤裸裸得逆元问题。现在用逆元来水过。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int mod=9973; void ex_gcd(int a,int b,int &d,int &x,int &y) { if(b==0) { x=1;y=0;d=a; } else { ex_gcd(b,a%b,d,y,x); y-=(a/b)*x; } } int main() { int T,n,b; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&b); int d,x,y; ex_gcd(b,mod,d,x,y); x=(x%mod+mod)%mod; // x可能为负数 printf("%d\n",n*x%mod); } return 0; }
相关文章推荐
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
- 扩展GCD的一些理解(求逆元,解同余方程,解方程等等)
- 扩展欧几里德求逆元模版
- 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
- uva 12169 扩展Gcd
- 欧几里得算法(gcd)和扩展欧几里得
- nyist 769 乘数密码(扩展欧几里得求逆元)
- [置顶] 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
- CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元
- [hdu 4828]Grids 数论(扩展欧几里得求逆元)
- 扩展GCD算法学习笔记
- HNU2[J题]Modified LCS 扩展GCD
- 扩展欧几里得求逆元
- 扩展GCD
- POJ2115 C Looooops ——模线性方程(扩展gcd)
- POJ 2891 Strange Way to Express Integers 扩展gcd
- 逆元的几种求法(扩展欧几里得,费马小定理或欧拉定理,特例,打表等)
- HDOJ A/B 1576【扩展欧几里得+求逆元】
- UVA - 12169 扩展GCD
- [CF338D]GCD Table(扩展中国剩余定理)