先上學習資料:
lucas』 theorem
中國剩餘定理 chinese remainder theorem
組合數取模 - acdreamer
lucas 定理用來計算組合數模素數。如果素數p可以先確定,則可以o(
p)預處理,每次計算時間複雜度為 o(
logp
logn
) 。不預處理的時間複雜度,o(
plog
n)。中國剩餘定理用來解模方程組
其中 m1, m2 … mn 任意兩數互質
結合兩個定理,就可以求解組合數模任意數。通過將模分解成若干質數,用 lucas定理 分別求解,再用 crt 合併。
下面是一些習題
hdu 3944 dp?
先可以猜想兩種路徑,從終點斜向上走到邊界,或豎直向上走到邊界,則得到兩種答案。
1) (n+
1m)+
n−m
2) (n+
1m+1
)+m
兩者相減可以計算出,2∗
m<
n 時,2)比較優,否則選 1)。
const
int n = 1e4;
const
int pn = 1300;
int *fc, mod;
int fac[pn][n + 5]; // 階乘表
int pnm, pi[pn]; // 素數總數,素數表
inline ll c(ll n, ll m)
ll lucas(ll n, ll m)
void init()
}int main()
return
0;}
hdu 5446 unknown treasure
lucas 結合 crt 模板題,特點是 n, m, m(為分解的模)都達到了1e18
所以,在 crt 合併的時候要採取避免 long long 溢位的姿勢。
// x = ai (mod mi)
// m = m1 * m2 * ... * mk, mi = m / mi
// x = sum + nm, 通解
ll remindchina( const ll a, const ll m, int k )
return ans;
}int main()
}ll ai[16];
rep(i, 0, pnm-1)
ll ans = remindchina(ai, pi, pnm);
cout
<< ans << endl;
}return
0;}
中國剩餘定理 擴充套件中國剩餘定理
中國剩餘定理 對於求解一元不定方程組 的一種演算法叫做中國剩餘定理。又名孫子定理。其中m1,m2,m3.mk 為兩兩互質的整數,求x的最小非負整數解 令m mi 1 i n m是所有mi的最小公倍數 ti為同餘方程 ti m mi 1 mod mi 的最小非負整數解 則有乙個解 x ai m mi ...
中國剩餘定理(孫子定理)
設m1,m2 mk是k個兩兩互素的正整數 則同餘方程組 x a1 mod m1 x a2 mod m2 x ak mod mk 記m m1 m2 m3 mk 有bj使mm j bj 1 m odmj 則x i 1 kmmj aj bjps x不一定是最小的需要mod m 例題 求下列同餘方程組最小解...
中國剩餘定理(孫子定理)
中國剩餘定理,也叫孫子定理,是數論中的又乙個重要定理,那麼它是幹什麼用的呢?簡單來說,這是乙個用來求一元線性同餘方程組的定理。叫做孫子定理的原因就是該定理最早可見於南北朝時期的著作 孫子算經 捲下第二十六題,叫做 物不知數 問題,原文如下 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物...