题目
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
const int mod = 5000011;
int fac[N], infac[N];
int qmi(int base, int expo, int p)
{int retval = 1;while(expo){if(expo & 1) retval = (LL)retval * base % p;base = (LL)base * base % p;expo >>= 1;}return retval;
}
void init(int n)
{fac[0] = infac[0] = 1;for(int i = 1; i <= n; i++){fac[i] = (LL)fac[i-1] * i % mod;infac[i] = (LL)infac[i-1] * qmi(i, mod-2, mod) % mod;}
}
int getc(int a, int b)
{return (LL)fac[a] * infac[b] % mod * infac[a-b] % mod;
}
int main()
{int n, k;cin >> n >> k;init(N);int ans = 0;if(n == 1) ans = 2;else if(n == 2) ans = 2;else{ans += 1 + n;for(int i = 2; i + (i-1) * k <= n; i++){int j = n - i - (i-1) * k;if(j == 0) ans += 1;else ans += getc(i+j, j);ans %= mod;}}cout << ans;return 0;
}
思路
(牡牛数目用A表示,牝牛数目用B表示)
遍历A数目从0~n。
其中,当A=0时,方案数为1。
当A = 1时,方案数为n。
当A >= 2时,假设有ABA结构(多余的B先不考虑):其中A = i,B = (i-1) * k。
则剩余的B数量为j。
若此时j == 0,则方案数为1。(getc中i >= 2, j+1 = 1,retval = 0)。
若j != 0,B牛有j个,存在i+1个空。
这下最麻烦的部分就是如何把B牛分到i+1个位置里,位置可以放0个。
1 n球(牛)同 m盒子不同 盒子不空
C(n-1, m-1)
2 如果改成盒子可空,则等价于:加入m个透明假球 仍旧盒子不空
C(n+m-1, m-1)。其中全是透明假球的盒子就等价于空盒子,m个的目的是为了产生m-1个空盒子的情况。