目錄中國剩餘定理 (chinese remainder theorem) 簡稱crt。
crt可以求解乙個這樣的方程組的最小解
\[\left\
x \equiv b_1 \pmod \\
x \equiv b_2 \pmod \\
x \equiv b_3 \pmod \\
\vdots \\
x \equiv b_k \pmod \\
\end
\right.
\]這裡保證陣列 \(a\) 兩兩互質。
crt的原理就是得到 \(c_i\) 使 \(c_i \equiv 1 \pmod \) 並且 \(c_i \equiv 0 \pmod ,i\not= j\)
顯然答案就是 \(\sum^k_ b_ic_i\)
演算法流程如下:
計算 \(a=\prod a_i\)
對於第 \(i\) 個方程:
a. 計算 \(m_i=\frac\)
b. 計算 \(m_i\) 在模 \(a_i\) 的逆元 \(m_i^\)
c. 計算 \(c_i=m_i\times m_i^\)
方程的解為 \(x \equiv \sum^k_b_ic_i \pmod a\)
證明略 (顯然啊)
**(洛谷p1495):
#include#define maxn 100039
using namespace std;
//#define debug
typedef long long ll;
typedef long long type;
inline type read()
if(flag) return -sum;
return sum;
}ll n,a[maxn],b[maxn];
ll sn,m,c,ans;
ll gcd(ll a,ll b)
inline ll lcm(ll a,ll b)
void exgcd(ll a,ll b,ll &x,ll &y)
exgcd(b,a%b,x,y);
ll t=x;
x=y; y=t-a/b*y;
return;
}ll js(ll a1,ll b1,ll a2,ll b2)//x=b_i(mod a_i)
ll excrt()
return tb;
}int main()
如果陣列 \(a\) 不是兩兩互質呢?
我們嘗試修復一下crt的方法讓它變成excrt,但是我們發現,crt的核心都說過了,它是求出 \(c_i\) 使 \(c_i \equiv 1 \pmod \) 並且 \(c_i \equiv 0 \pmod ,i\not= j\) ,但是我們發現,我們有時不能找到這樣的 \(c_i\) ,所以crt原來的思路是不能實現的。
看來只能用另外一種方法了。
考慮兩個方程的情況。
\[\left\
x \equiv b_1 \pmod \\
x \equiv b_2 \pmod \\
\end
\right.
\]令 \(x=a_1q+b_1=a2_p+b_2\)
移項,得到 \(a_1q+a_2(-p)=b_2-b_1\)
顯然只要exgcd解出 \(p,q\) 的一組解就可以解決問題了,然後顯然合併後的方程是:
\[x \equiv a_1q+b_1 \pmod \left(a_1,a_2\right)}
\]然後就可以過 洛谷p4777了,當然要注意精度問題,加上防爆乘,不然會炸精度。。。
#include#define maxn 100039
using namespace std;
//#define debug
typedef long long ll;
typedef long long type;
inline type read()
if(flag) return -sum;
return sum;
}ll mol(ll a,ll b,ll p)
if(flag) return (-ans%p+p)%p;
return ans%p;
}ll gcd(ll a,ll b)
inline ll lcm(ll a,ll b)
void exgcd(ll a,ll b,ll &x,ll &y)
exgcd(b,a%b,x,y);
ll t=x;
x=y; y=t-(a/b)*y;
return;
}int n;
ll a[maxn],b[maxn];
ll excrt()
return ans%m;
}//x=b(mod a)
int main()
中國剩餘定理學習筆記
上次jt暑假講的時候我數學太弱並沒有聽懂qwq。假設有方程組 mi 兩兩互質 x ai m odmi 令 m i 1nmi wi mmi 易知有 gc d wi mi 1下一步求出pi 使得 wi pi 1 mo dmi 這個時候x的乙個解可以表示為 x i 1 nwi pi a i 為什麼x可行呢...
中國剩餘定理學習筆記
先看一道poj上的題目 poj1006 biorhythms 人自出生起就有體力,情感和智力三個生理週期,分別為23,28和33天。乙個週期內有一天為峰值,在這一天,人在對應的方面 體力,情感或智力 表現最好。通常這三個週期的峰值不會是同一天。現在給出三個日期,分別對應於體力,情感,智力出現峰值的日...
中國剩餘定理學習筆記
先看一道poj上的題目 poj1006 biorhythms 人自出生起就有體力,情感和智力三個生理週期,分別為23,28和33天。乙個週期內有一天為峰值,在這一天,人在對應的方面 體力,情感或智力 表現最好。通常這三個週期的峰值不會是同一天。現在給出三個日期,分別對應於體力,情感,智力出現峰值的日...