#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
//#define debug
using namespace std;
const int inf = 0x3fffffff;
const int mod = 1000000007;
const int mmax = 1000010;
typedef long long LL;
int n,m,k;
LL inv[mmax];
LL jie[mmax];
LL dp[1100];
void pre()
{
inv[0]=inv[1]=1;
jie[0]=jie[1]=1;
for(int i=2;i<mmax;i++)
{
inv[i]=(LL)(mod-mod/i)*inv[mod%i]%mod;
jie[i]=jie[i-1]*i;
jie[i]%=mod;
}
for(int i=2;i<mmax;i++)
{
inv[i]*=inv[i-1];
inv[i]%=mod;
}
}
LL Pow_mod(LL x ,int n)
{
LL res=1,tmp=x;
for(;n;n/=2)
{
if(n&1)
res=(res*tmp)%mod;
tmp=(tmp*tmp)%mod;
}
return res;
}
LL C(int x,int y)
{
if(y>x)
return 0;
return jie[x]*inv[y]%mod*inv[x-y]%mod;
}
void build()
{
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;i++)
{
dp[i]=Pow_mod(i,n);
for(int j=1;j<i;j++)
{
dp[i]-=dp[i-j]*C(i,j)%mod;
dp[i]=(dp[i]%mod+mod)%mod;
}
}
}
int main()
{
pre();
while(~scanf("%d %d %d",&n,&m,&k))
{
if(m==1)
{
printf("%lld\n",Pow_mod(k,n));
continue;
}
build();
LL cnt=0;
for(int i=0;i<=n;i++)
{
for(int j=0;i+j<=n;j++)
{
LL tmp=1;
tmp=C(k,i)*C(k-i,j)%mod*C(k-i-j,j)%mod;
tmp*=dp[i+j]*dp[i+j]%mod*Pow_mod((LL)i,n*(m-2))%mod;
tmp%=mod;
cnt+=tmp;
cnt%=mod;
}
}
printf("%lld\n",cnt);
}
return 0;
}
swust oj 2516 教练我想学算术 dp+组合计数
原创mb61c46a7ab1eee ©著作权
©著作权归作者所有:来自51CTO博客作者mb61c46a7ab1eee的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:小贝_redis高级应用-安全性
下一篇:如何查找Sensor信息
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C# Onnx yolov8 竹签计数、一次性筷子计数
C# Onnx yolov8 竹签计数、一次性筷子计数
Image System Text -
【LeetCode】39. 组合总和
【LeetCode】39. 组合总和
leetcode 数据结构与算法 C++ -
排序算法之计数排序的优化
排序算法之计数排序的优化
数组 计数排序 最小值 -
CSU 2069 Saruman‘s Level Up(数位dp/组合计数)
大致题意:让你求在1到n范围内转换成二进制后1的个数是3的倍数的数字的个
CSU 数位dp #include #define i++ -
CSU 1810 Reverse (组合计数)
计数的题目总是受欢迎。 这题题意是可以每次反转一个区间,得到一
CSU 组合计数 #include #define i++