题目大意:给定n,把它分成k分,可以为0,问有几种分法?
题目解析:想起了高中组合数学的隔板法,因为可以为0,所以不妨再给n加上k,这样分成k分就最少是一个了,所以答案就是C(n+k-1,k-1),接下来就是逆元的事情了;
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
const int M = 2000010;
const LL mod=1000000007;
LL pre[M], pows[M];
void init()
{
pre[0] = 1;
for(int i=1; i<M; i++)
{
pre[i] = pre[i-1] * i % mod;
}
}
LL quickpow(LL n, LL m, LL k)
{
LL res = 1;
while(m)
{
if(m & 1)
{
res = res * n % k;
}
m >>= 1;
n = n * n % k;
}
return res;
}
int main()
{
int t;
LL ans, n, m, a, b, c;
scanf("%d", &t);
init();
for(int ca=1; ca<=t; ca++)
{
scanf("%lld%lld", &n, &m);
a = pre[n+m-1];
b = quickpow(pre[m-1],mod-2,mod);
c= quickpow(pre[n],mod-2,mod);
ans = (a * c % mod) * b % mod;
printf("Case %d: %lld\n", ca, ans);
}
return 0;
}