本頁面已停止更新 新的版本可至此處觀看
先以兩兩來看
我們下面主要要解的是
貝祖定理: 在
中, 若且唯若 是 及 的最大公因數 的倍數,有整數解
若
令
其中
模逆元移向證明:
兩邊同乘
設
故
而新的同餘式就是
即可表達為
又
故若得前
而與第
以上面來的
輾轉相除法:
令
一直互相相減之後就會得到
https://hackmd.io/@Koios/rJ_lER719
證明: 為什麼除以一個數取模等於乘以這個數的模逆元
證明圖片
擴展歐里基德推導:
整理右式
推得轉移式
pii ex_gcd(int a,int b) {
if (b == 0) {
return {1, 0};
}
pii p = ex_gcd(b, a%b);
int x = p.second;
int y = p.first - p.second*(a/b);
return {x,y};
}
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
int p[1001], k[1001];
int n;
pii ex_gcd(int a,int b) {
if (b == 0) {
return {1, 0};
}
pii p = ex_gcd(b, a%b);
int x = p.second;
int y = p.first - p.second*(a/b);
return {x,y};
}
int china () {
int X = p[1];
int lcm = k[1];
/*
x ≡ p1(mod k1)
x ≡ p2(mod k2)
x = x1 * k1 + p1
x = x2 * k2 + p2
x1 * k1 - x2 * k2 = p2 - p1
*/
// 可以假設 k1 是已經有的
// k2 是現在要算的
for (int i = 2; i <= n; i++) {
int c = p[i] - X; // p2-p1
int d = __gcd(k[i], lcm); //k1*k2
if (c % d != 0) return -1;
auto [x,y] = ex_gcd(lcm/d, k[i]/d);
// (lcm/d)*(x1) + (k2/d)*(x2) = 1
x = (c) / d * x % (k[i] / d);
// 因為是模逆元, 被 模過 k[i]*d 下, 要是又超過了就要在模一次
X += lcm*x; // X 每次都要更新
lcm = lcm / d * k[i]; // lcm 每次都要更新
// x ≡ X (mod lcm)
X %= lcm;
}
return (X > 0) ? X : X + lcm;
}
signed main() {
while(cin >> n) {
for (int i = 1; i <= n; i++) {
cin >> k[i] >> p[i];
}
cout << china() << '\n';
}
}
credit :
int china () {
int M = 1;
for (int i = 1; i <= n; i++) M *= k[i];
int ret = 0;
for (int i = 1; i <= n; i++) {
int Mi = M / k[i];
auto [t, y] = ex_gcd(Mi, k[i]);
ret = (ret + p[i]*Mi*t) % M;
// 最後要去在 1 ~ M 的解, 所以要 mod M
}
return (ret + M) % M;
}
algo
{%hackmd @ioncamp/__style %} 想法 $dp[i]=dp[j]+v[i]$ $O(n^2)$ 維護單調 $\texttt{stack}$
Dec 1, 2022{%hackmd @ioncamp/__style %} 題目 給 $n,k,c[1]\sim c[k]$ 代表 $a$ 出現 $c[1]$ 次,$b$ 出現 $c[2]$ 次... $\sum\limits_{i=1}^k c[i]=n$ 這些 $1\sim k$ 組成了一個長度為 $n$ 的字串
Dec 1, 2022{%hackmd @ioncamp/__style %} 題目 構造一個 $1..n$ 的排列使得他的 最長單調子序列 恰好長度為 $k$ 最長單調子序列 是指這個子序列單調遞增或單調遞減 想法
Nov 30, 2022{%hackmd @ioncamp/__style %} outline outline init 加法 減法 乘法 除法
Nov 1, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up