f(k)=k∗(k−1)n−1=选择不超过k种颜色,相邻颜色不同,染n个格子的方案数
(第一个格子有k种选择,之后n−1个格子有k−1种颜色可以选)
恰好使用了k种颜色的方案数=f(k)−(不用颜色1+不用颜色2+...)+(不用颜色1和2+不用颜色1和3+...)−...
ans=f(k)−Ck−1kf(k−1)+Ck−2kf(k−2)−....
ans=f(k)+∑k−1i=1(−1)iCk−ikf(k−i)
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int inf=1e9+7;
const int N = 1e6+5;
const int M = 5e5;
ll qPow(ll a,ll n){
ll ans=1;
ll t=a%inf;
while(n){
if(n&1){
ans=(ans*t)%inf;
}
t=(t*t)%inf;
n>>=1;
}
return ans;
}
ll ny(ll a){//逆元
return qPow(a,inf-2);
}
ll fact[N];
void initFact(){
fact[0]=1;
for(int i=1;i<N;++i){
fact[i]=((ll)i*fact[i-1])%inf;
}
}
ll C(int n,int k){
if(k>n){
return 0;
}
ll fz=fact[n];
ll fm=(fact[k]*fact[n-k])%inf;
fm=ny(fm);
return (fz*fm)%inf;
}
ll Cb(int n,int k){
if(k>n){
return 0;
}
ll ans=1;
for(int i=0;i<k;++i){
ans=(ans*(n-i))%inf;
}
ll fm=fact[k];
fm=ny(fm);
return (ans*fm)%inf;
}
ll f(ll k,int n){
ll t=(k*qPow(k-1,n-1))%inf;
return t;
}
ll slove(int n,int m,int k){
ll ans=f(k,n);
int flag=-1;
for(int i=1;i<k;++i){
ll t=(C(k,k-i)*f(k-i,n))%inf;
ans=(ans+flag*t)%inf;
flag*=-1;
}
return ((ans*Cb(m,k))%inf+inf)%inf;
}
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
//freopen("/home/lu/code/w.txt","w",stdout);
int T;
initFact();
scanf("%d",&T);
for(int tt=1;tt<=T;++tt){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
ll ans=slove(n,m,k);
printf("Case #%d: %lld\n",tt,ans);
}
return 0;
}