hdu 1573 A/B (扩展欧几里得)
来源:互联网 发布:如何连接网络摄像头 编辑:程序博客网 时间:2024/06/09 15:21
Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1)。
Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1<= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
2
1000 53
87 123456789
Sample Output
7922
6060
/*************************
欧几里得算法,又称辗转相除法,用于求最大公约数: c = gcd(a,b) = gcd(b,a%b);
扩展欧几里得算法:
若a,b不全为0,则存在x,y使得 c = gcd(a,b) = a*x+b*y;
因为 gcd(a,b) = gcd(b,a%b),则有 x*a + y * b = x1 * b + y1 * (a%b),等式右边变形,则得到:b * x1 + (a%b) * y1 = b * x1+(a-a/b*b) * y1 = a * y1+b * (x1 - ( a / b) * y1)。
则 x = y1 , y= x1-(a/b)*y1,然后可由后向前迭代得到 x,y。
1573 A/B:
A%B = 0 可令 x = A / B -> A = B*x;
n = A % 9973 = A - A / 9973 * 9973 :
= B*x - A/9973*9973
= n
可以 令 y = A / 9973; 则 B * x + y * 9973 = n;
因为 gcd(9973,B) = 1,所以不能用exgcd(B,9973,x,y);
B * x1 + 9973 * y1 = 1; -> B * x1 *n + 9973 * y1 * n = n;
红色字体的两个式子比较系数就可以看出 x = x1 * n;
然后求 x % 9973 就OK 了
代码:
#include <iostream>using namespace std;int exgcd(int a,int b,int &x,int &y)// 扩展欧几里得函数模板{ if(b==0) { x = 1;y = 0;return a; } int d = exgcd(b,a%b,x,y); int t = x; x = y; y = t-a/b*y; return d;}int main(){ int t,n,B,x,y,ans,xx; cin>>t; while(t--) { cin>>n>>B; ans = exgcd(B,9973,x,y); xx = x*n; ans = (xx%9973+9973)%9973; // 防止 x 为负数 cout<<ans<<endl; }}
- hdu 1573 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】1576 - A/B(扩展欧几里得)
- HDU 1576A/B 扩展欧几里得
- HDU 1576-A/B(扩展欧几里得算法)
- 扩展欧几里得 以A/B HDU
- HDU-1576 A/B (扩展欧几里得算法)
- hdu 1576 A/B(扩展欧几里得)
- HDU 1576 A/B 扩展欧几里得
- 输出随机认证码图片
- 关于"作数类型冲突: nvarchar 与 image 不兼容"的问题(DBNull)
- 指针函数与函数指针区别《转载》
- Java中重载和重写的区别
- OGRE(六)
- hdu 1573 A/B (扩展欧几里得)
- 整理笔记
- Matlab统计矩阵内各值出现次数以及所占比例
- 跨站脚本XSS
- android开发之自动化编译ota升级包脚本说明
- MFC 多线程及线程同步
- Java创建线程的两个方法
- ASP.NET ViewState详解
- 《算法导论》笔记 第8章 8.3基数排序