首页 > 代码库 > HDU 1576 A/B(扩展欧几里德变形)
HDU 1576 A/B(扩展欧几里德变形)
一道扩展欧几里德的变形题目
题中给出 n = A%9973 → n = A - A/9973*9973(若x = A%B 则 x = A - A/B*B)
因为A能整除B 所以设x = A/B → A = B*x
所以原式 = B*x - A/9973*9973 = n 设y = A/9973
B*x - 9973y = n
然后利用扩展欧几里德求出x即可。
#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cstring>using namespace std;int n, B, T;int gcd(int a, int b){ if(b == 0) return a; return gcd(b, a%b);}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 t = x; x = y; y= t- a/ b* y; return;}int main(){ scanf("%d", &T); while(T--){ scanf("%d%d", &n, &B); int a = B; int b = 9973; int m = n; int d = gcd(a,b); int a1, b1, m1,x ,y; a1 = a/d; b1 = b/d; m1 = m/d; exgcd(a1, b1, x, y); int x1 = x*m1; int ans = x1%b1; while(ans < 0){ ans += b1; } printf("%d\n", ans%9973); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。