HDU 1576-A/B(扩展欧几里得算法)
来源:互联网 发布:服务器端 语言 python 编辑:程序博客网 时间:2024/06/04 18:26
A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6144 Accepted Submission(s): 4835
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
21000 5387 123456789
79226060//扩展欧几里得算法,用逆元求除法取模//对于求除法取模,(a/b)%c = (a*ni)%c,其中ni是b与c的逆元//逆元的求法是扩展欧几里得算法,exged(b,c,x,y),最终的x便是b与c的逆元#include <stdio.h>int exgcd(int a, int b, int &x, int &y){if(b==0){x = 1;y = 0;return a;}int r = exgcd(b, a%b, x, y);int t = x;x = y;y = t-a/b*y;return r;}int main(){int T;scanf("%d", &T);while(T--){int a, b;scanf("%d%d", &a, &b);int x, y;exgcd(b, 9973, x, y);int ans = (a*x)%9973;if(ans>=0) printf("%d\n", ans); else printf("%d\n", ans+9973);}return 0;}最后,总结一下扩展欧几里得能干什么扩展欧几里德算法的应用主要有以下三方面:
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;
(1)使用扩展欧几里德算法解决不定方程的办法:
对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(p, q)的每个解乘上 c/Gcd(p, q) 即可。
用扩展欧几里得算法解不定方程ax+by=c;代码如下:bool linear_equation(int a,int b,int c,int &x,int &y){ int d=exgcd(a,b,x,y); if(c%d) return false; int k=c/d; x*=k; y*=k; //求得的只是其中一组解 return true;}
(2)用扩展欧几里德算法求解模线性方程的方法:(我还不是很懂)
同余方程 ax≡b (mod n)对于未知数 x 有解,当且仅当 gcd(a,n) | b。且方程有解时,方程有 gcd(a,n) 个解。
求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)
可以学习一下:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
(3)用欧几里德算法求模的逆元:(可以用来求除法取模,即(a/b)%c==a*ni(b,c)%c)
同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。
- hdu-1576-A/B【扩展欧几里得算法】
- hdu 1576 A/B 扩展欧几里得算法
- HDU 1576-A/B(扩展欧几里得算法)
- HDU-1576 A/B (扩展欧几里得算法)
- [数论]HDU 1576 A/B 扩展欧几里得算法
- HDU 1576 A/B(扩展欧几里得算法)
- HDU 1576 A/B 扩展欧几里得
- 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 扩展欧几里得
- hdu 1576 A/B(扩展欧几里得)
- HDU 1576 A/B 扩展欧几里得
- cpu cache 学习记录
- cs231n作业一之 在cifar-10上实现KNN
- ThinkPHP 3.1.2 视图
- 使用ajax异步请求数据,并展示在html中
- 怎样退出终止App
- HDU 1576-A/B(扩展欧几里得算法)
- 详解js闭包
- gradle学习笔记(下)
- JSP--整合SiteMesh02
- 魔法工会
- vin码OCR识别解析查询
- volatile关键字
- C++中的四类强制转换?
- java学习(10) lambda表达式