中国剩余定理
中国剩余定理给出了以下的一元线性同余方程组:
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1,m2, … ,mn两两互质,则对任意的整数:a1,a2, … ,an,方程组(S)有解,并且通解可以用如下方式构造得到:
设是整数m1,m2, … ,mn的乘积,并设
是除了mi以外的n- 1个整数的乘积。
设的数论倒数( 为 模 意义下的逆元)
方程组(S)的通解形式为
在模M的意义下,方程组(S)只有一个解:
表达整数的奇怪方式
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int exgcd(ll a, ll b, ll &x, ll &y) //在欧几里得算法的基础上进行扩展,算出xy
{
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 f=1;
ll a1,m1;
cin>>a1>>m1;
for(int i=0;i<n-1;i++)
{
ll a2,m2;
cin>>a2>>m2;
ll k1,k2;
ll d=exgcd(a1,a2,k1,k2);
if((m2-m1)%d)
{
f=0;
break;
}
k1*=(m2-m1)/d;
ll t=a2/d;
k1=(k1%t+t)%t;
m1=a1*k1+m1;
a1=abs(a1/d*a2);
}
if(f) cout<<(m1%a1+a1)%a1<<endl; //注意在c++中取余的定义和数学中不同,c++中取余的结果可能是负数
else cout<<"-1"<<endl;
return 0;
}