bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列組合)
阿新 • • 發佈:2018-12-31
geo mes can line llc names 裏的 簡單的 tro
原題鏈接
題目描述:約翰要帶N(1≤N≤100000)只牛去參加集會裏的展示活動,這些牛可以是牡牛,也可以是牝牛.牛們要站成一排.但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩只牡牛之間至少要有K(O≤K<N)只牝牛.請計算一共有多少種排隊的方法.所有牡牛可以看成是相同的,所有牝牛也一樣.答案對5000011取模。
輸入格式:一行,輸入兩個整數N和K.
輸出格式:一個整數,表示排隊的方法數.
輸入樣例:
4 2
輸出樣例:
6
解析:一道比較簡單的題,直接組合數算一下即可。
代碼如下:
#include<cstdio> using namespace std; const int MOD = 5000011; int n, k, fac[100005], ans; int ksm(int x, int y) { int res = 1, base = x; while (y > 0) { if (y & 1) res = 1ll * res * base % MOD; base = 1ll * base * base % MOD; y >>= 1; } return res; } int C(int a, int b) { int inv = 1ll * ksm(fac[b], MOD - 2) * ksm(fac[a - b], MOD - 2) % MOD; return 1ll * fac[a] * inv % MOD; } int main() { scanf("%d %d", &n, &k); fac[0 ] = 1; ans = 1; for (int i = 1; i <= n; ++ i) fac[i] = 1ll * fac[i - 1] * i % MOD; for (int i = 1; i <= n; ++ i) { int tmp = n - (i - 1) * k; if (i > tmp) break; ans += C(tmp, i); ans %= MOD; } printf("%d", ans); return 0; }
bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列組合)