中国剩余定理——acwing
题目:表达整数的奇怪方式
分析
代码
a 与 b得最大公约数是正整数
例如:-6和3, 6和3,6和-3,都是3,都是一样的,所以不用管啥-a2,a2啥的,统统取正
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(!b) {
x = 1, y = 0;
return a;
}
ll d = exgcd(b,a%b, x, y);
int t = y; y = x-(a/b)*y; x = t;
return d;
}
int main() {
int _;
cin >> _;
int flag = 1;
ll a1, m1;
cin >> a1 >> m1;
_ --;
while(_ --) {
ll a2, m2;
cin >> a2 >> m2;
ll k1, k2;
ll d = exgcd(a1,a2,k1,k2);
// exgcd无解,k1,k2无解
if((m2-m1)%d) {
flag = 0; break;
}
// 扩大 k1,k2
k1 *= (m2-m1)/d;
// 最小k1
ll t = a2/d;
k1 = (k1%t+t)%t; // 模加模,防止模出负数,得k1最小正解
// 更新a1, m1
m1 = a1*k1+m1;
a1 = abs(a1/d*a2);
}
if(flag) cout << (m1%a1+a1)%a1 << endl;
else puts("-1");
return 0;
}
原文地址:https://blog.csdn.net/2401_87338545/article/details/144154607
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!