redis 常用型別
阿新 • • 發佈:2021-01-05
中國剩餘定理
中國剩餘定理給出了以下的一元線性同餘方程組:
有解的判定條件,並用構造法給出了在有解情況下解的具體形式。
中國剩餘定理說明:假設整數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;
}