對於c(n, m) mod p。這裡的n,m,p(p為素數)都很大的情況。就不能再用c(n, m) = c(n - 1,m) + c(n - 1, m - 1)的公式遞推了。
這裡用到lusac定理
for non-negative integers m and n and a prime p, the following congruence relation holds:
where
andare the base p expansions of m and n respectively.
對於單獨的c(ni, mi) mod p,已知c(n, m) mod p = n!/(m!(n - m)!) mod p。顯然除法取模,這裡要用到m!(n-m)!的逆元。
根據費馬小定理:
已知(a, p) = 1,則 ap-1 ≡ 1 (mod p), 所以 a*ap-2 ≡ 1 (mod p)。
也就是 (m!(n-m)!)的逆元為 (m!(n-m)!)p-2 ;
**:
typedef longlong
ll;using
namespace
std;
ll exp_mod(ll a, ll b, ll p)
return
res;
}ll comb(ll a, ll b, ll p)
ans = (ca*exp_mod(cb, p - 2, p)) %p;
return
ans;
}ll lucas(
int n, int m, int
p)
return
ans;
}int
main()
return0;
}
組合數取模
複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...
組合數取模
組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...
Lucas 組合數取模
組合數取模就是求 cn mmod p cmn modp 的值,當然根據n,m,p n,m p 的取值範圍不同,採取的方法也不一樣。p p 比較大就只能乙個乙個算如 ll c one by one ll n,ll m 組合數乙個乙個算但是不是很大的要預先處理好階乘 數很大需要逆元 typedef lo...