AcWing 204. 表达整数的奇怪方式
原题链接
中等
作者:
minux
,
2020-04-29 16:22:11
,
所有人可见
,
阅读 526
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
// 扩展欧几里得算法
int exgcd(LL a, LL b, LL &x, LL &y){
if(!b){x=1; y=0; return a;}
int d=exgcd(b, a%b, y, x);
y-=a/b*x;
return d;
}
int main(){
int n;
cin>>n;
bool flag=true; // 表示方程组是否有解
LL a1, m1; // 第一组方程参数
cin>>a1>>m1;
while(n--){
LL a2, m2;
cin>>a2>>m2; // 依次读入方程参数并进行参数合并
LL k1, k2; // 扩展欧几里得算法求解k1a1-k2a2=m2-m1的线性组合参数(k1, k2)
LL d=exgcd(a1, a2, k1, k2);
if((m2-m1)%d){flag=false; break;} // 方程无解, 否则合并方程参数(a1, m1)
k1*=(m2-m1)/d;
LL t=a2/d;
k1=(k1%t+t)%t;
m1=a1*k1+m1;
a1=abs(a1/d*a2);
}
if(flag) cout<<(m1%a1+a1)%a1<<endl;
else puts("-1");
return 0;
}