總結 lucas 定理 中國剩餘定理

2021-07-05 06:56:07 字數 1401 閱讀 4602

先上學習資料:

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 例題 求下列同餘方程組最小解...

中國剩餘定理(孫子定理)

中國剩餘定理,也叫孫子定理,是數論中的又乙個重要定理,那麼它是幹什麼用的呢?簡單來說,這是乙個用來求一元線性同餘方程組的定理。叫做孫子定理的原因就是該定理最早可見於南北朝時期的著作 孫子算經 捲下第二十六題,叫做 物不知數 問題,原文如下 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物...