- gcd算法:
快速求最大公约数的算法, 用的是辗转相除法, 代码非常简单, 不清楚数学推理的记下代码就ok了
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;
}
- 扩展gcd, HDU 2669:Romantic
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll ext_gcd(ll a, ll b, ll &x, ll &y)
{
ll d = a; //用d存储最大公约数
if(b != 0)
{
d = ext_gcd(b, a % b, y, x); //x, y调换位置a, b同gcd
y -= a / b * x;
}
else //当b为0, x取1, y取0
x = 1, y = 0;
return d;
}
int main()
{
ll a, b;
while(~scanf("%lld %lld", &a, &b))
{
ll x, y;
ll d = ext_gcd(a, b, x, y);
if(d != 1)
printf("sorry\n");
else
{
if(x<0)
x+=b;y-=a;
printf("%lld %lld\n", x, y);
}
}
}
另gcd(a, b) = gcd(a, b - a)牛客小白月赛12:G 华华对月月的忠诚, 这一题就是用这个道理做的, 不知道gcd(a, b) - gcd(a, b - a)的话很难做出来。
传送门