同余方程 乘法逆元 扩展欧几里得算法
526 同余方程 乘法逆元 扩展欧几里得算法_哔哩哔哩_bilibili
给定整数a,b,m,求解同余方程ax=b(mod m).
如果x存在整数解,则输出任意一个;
如果不存在,则输出none
例: 8x=4(mod 6).整数解x=2;
扩展欧几里得求解线性同余方程,
把同余方程转化为求解不定方程,
ax=b(mod m)得到ax=m(-y)+b,得到ax+my=b;
由裴属定理,当gcd(a,m)|b时有解。
用扩展算法,求ax+my=gcd(a,m)的解把x乘以b/gcd(a,m)得到原方程的特解。
524 裴蜀定理_哔哩哔哩_bilibili
#include<bits/stdc++.h>
using namespace std;
//裴属定理
//一定存在整数x,y,满足ax+by=gcd(a,b)
//一定存在整数x,y,满足ax+by=gcd(a,b)*n
//一定存在整数Xi,i=1...n,AiXi和=gcd(Ai),i=1..n
//欧几里得求gcd(a,b)时若带入负数,结果会返回负数
//gcd(8,-4)=-4;系数Ai是负数,求gcd时可以带入绝对值
//确保最大公约数是正数
int gcd(int a,int b){//求gcd
return b==0?a:gcd(b,a%b);
}
int main(){
/*
int a,b,m,x,y;
scanf("%d%d%d",&a,&b,&m);
int d=exgcd(a,m,x,y);
if(b%d==0)printf("%d",1ll*x*b/d%m);*/
int n;
int a,b;
cin>>n;
cin>>a;
while(--n){
cin>>b;
a=gcd(abs(a),abs(b));
}
cout<<a<<endl;
return 0;
}