发布文章 博文管理我的博客退出 Trash Temp 【贪心】数列极差问题 不容易系列之(3)—— LELE的RPG难题 欢迎使用CSDN-markdown编辑器 卡布列克常数 扩展欧几里得算法 任意进制转换 欧几里得算法求最大公约数和最小公倍数:
#include<stdio.h>
int gcd(int a,int b)
{
if(!b)
return a;
return gcd(b,a%b);
}
int main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=gcd(a,b);
printf("最大公约数:%d\n",c);
printf("最小公倍数:%d\n",a*b/c);
return 0;
}
扩展
一. 求ax+by=gcd(a,b)的一组特解:
ax+by=gcd(a,b)
∵ gcd(a,b) = gcd(b,a%b)
∴ ax1+by1 = bx2+(a%b)y2
则 ax1+by1 = bx2+(a-a/b*b)y2
∴ ax1+by1 = ay2+b(x2-a/b*y2)
∴ x1=y2 y1=(x2-a/b*y2)
当b==0时,ax+by = gcd(a,b) = a
∴ x=1 , y=0;
二.求方程通解:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll &x,ll b,ll&y)
{
if(!b)
{
x=1;y=0;return a;
}
ll gcd=exgcd(b,y,a%b,x);
y-=a/b*x;
printf("%lld %lld %lld %lld\n",a,b,x,y);
return gcd;
}
int main(){
ll x,y;
ll a,b;
cin>>a>>b;
exgcd(a,x,b,y); //exgcd(38,x,8,y);
return 0;
}
如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解)如果ax+by=1有解则gcd(a,b)=1;