拓展欧几里得 HDU 1576 A/B
来源:互联网 发布:js重新加载div 编辑:程序博客网 时间:2024/05/17 03:11
A/B
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
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)。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
Output
对应每组数据输出(A/B)%9973。
Sample Input
21000 5387 123456789
Sample Output
79226060
本题思路,
设(A/B)%9973=x,
所以,A/B=x+k*9973(k为未知),
所以,A=xB+k*9973B,
又因为,A%9973=n,
将上式(A=xB+k*9973B)代入本式(A%9973=n)得,
(xB+k*9973B)%9973=n,
化简得,xB%9973=n,
所以,xB=y*9973+n(y为未知),
即,Bx-9973y=n,
当题目条件处理到这一步,是不是有一种豁然开朗的感觉,对于上式,一个二元方程,用到了拓展欧几里得求解,
但是拓展欧几里得要求ax+by=gcd(a,b),
这是就要用到题目中的最后一个条件,gcd(B,9973)=1,
Bx-9973y=n等式两边同除以n得,(x/n)*B+(y/n)*9973=1=gcd(B,9973),
拓展欧几里得求出x/n,
然后乘以n,再取9973的模,就是结了
代码
#include <iostream>#include <cstdio>using namespace std;#define e 9973void exgcd(int a, int b, int &x, int &y){ if (b == 0) { x = 1; y = 0; return ; } exgcd(b, a%b, x ,y); int t = x; x = y; y = t-(a/b)*y;}int main(){ int T, n, B, x, y; scanf ("%d", &T); while (T--) { scanf ("%d %d",&n,&B); exgcd(B, e, x, y); x %= e; while (x < 0) x += e; printf ("%d\n",(x*n)%e); } return 0;}
0 0
- 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
- HDOJ 1576 A/B(拓展欧几里得)
- hdu 1576 拓展欧几里得
- hdoj A/B 1576 (拓展欧几里得) 数学变换
- 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 扩展欧几里得算法
- POJ 2470 Ambiguous permutations G++
- C++学习笔记(5)
- Redis学习总结(4)——Spring Data操作Redis
- error This file requires compiler and library support for the ISO C++ 2011 standard
- c++继承
- 拓展欧几里得 HDU 1576 A/B
- 与Web集成
- [TensorFlow] win10安装TensorFlow
- interface
- 蓝桥杯2017模拟赛本科组题目
- Python学习
- 74. Search a 2D Matrix
- PowerDesign 16.5.5.2 (4734) 汉化包
- css