• jQuery火箭图标返回顶部代码


    %%lkx

    学习博客

    exgcd(扩展欧几里得)

    可以用来判断并求解形如(ax+by=c)的方程,当且仅当(gcd(a,b)|c)时,存在整数解(x,y)
    也就是说,(exgcd)可以用来求解方程(ax+by=gcd(a,b)),令(a=b,b=a\%b)则有方程(b*x_1+(a\%b)*y_1=gcd(b,a\% b))
    又因为(gcd(a,b)=gcd(b,a\%b)),且(a\%b=a-b*) (lfloor {a/b} floor * y_1=gcd(a,b))
    整理得:(ay_1+b(x_1-lfloor {a/b} floor* y_1)=gcd(a,b))
    所以原方程中: (ay_1+ b(x_1-lfloor {a/b} floor *y_1)=gcd(a,b))
    所以我们只需递归求(x_1,y_1),就能求出(x,y)

    Code:

    void exgcd(int a, int b, int &x, int &y) {
    	if(!b) {x = 1, y = 0;return;}
    	int d = exgcd(b, a % b, y, x);
    	y -= a / b * x;
    	return d;
    }
    

    例:洛谷p1082同余方程

    #include <cstdio>
    #include <iostream>
    using namespace std; 
    int a, b, x, y;
    int read() {
    	int s = 0, w = 1;
    	char ch = getchar();
    	while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
    	while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();}
    	return s * w;
    }
    void exgcd(int a, int b, int &x, int &y) {
    	if(!b) x = 1, y = 0;
    	else exgcd(b, a % b, y, x), y -= a / b * x;
    }
    int main() {
    	a = read(), b = read();
    	exgcd(a, b, x, y);
    	cout << (x + b) % b << endl;
    	return 0;
    }
    

    谢谢收看, 祝身体健康!

  • 相关阅读:
    P3822 [NOI2017]整数
    P4630 [APIO2018] Duathlon 铁人两项
    P3230 [HNOI2013]比赛
    P2570 [ZJOI2010]贪吃的老鼠
    P4576 [CQOI2013]棋盘游戏
    P3256 [JLOI2013]赛车
    P3297 [SDOI2013]逃考
    CF487E Tourists
    设置一个双色球脚本(2)并带颜色输出
    设置一个双色球脚本
  • 原文地址:https://www.cnblogs.com/yanxiujie/p/11706756.html
Copyright © 2020-2023  润新知