题意:
N
朵花,有
题解:选
要求出正好
K
种颜色的,就要利用容斥原理,用不超过
答案就是
Ckm(F(k)−F(k−1)+F(k−2)...)=Ckm∑ki=1(−1)k−iF(i)
#include <iostream>
#include <cstring>
#include <cstdio>
#define prt(k) cout<<#k" = "<<k<<endl;
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const int N = 1000005;
ll inv[N];
ll C[N];
ll n, m, k;
ll powmod(ll a, ll n)
{
ll ret = 1;
for (; n; n>>=1, a=a*a%mod)
if (n&1)
ret = ret*a%mod;
return ret % mod;
}
void init(ll m, ll k)
{
C[0] = 1;
for (ll i=1;i<=k;i++)
C[i] = ( C[i-1] * (m-i+1) %mod )* inv[i]% mod;
}
ll F(ll i)
{
return (i*C[i] %mod )* powmod(i-1, n-1) % mod;
}
int main()
{
memset(inv, 0, sizeof inv);
for (int i=1;i<N;i++) inv[i] = powmod(i, mod-2)%mod;
int re, ca=1; scanf("%d", &re);
while (re--)
{
scanf("%I64d %I64d %I64d", &n, &m, &k);
ll sig = 1;
init(m, k);
ll ans = C[k]%mod;
ll tmp = 0;
memset(C, 0, sizeof C);
init(k, k);
for (ll i=k;i>=1;i--)
{
tmp = (tmp + sig * F(i) + mod) % mod;
sig = -sig;
}
ans = ans * tmp % mod;
printf("Case #%d: %I64d\n", ca++, ans);
}
return 0;
}