https://codeforces.com/contest/1228/problem/E
上周病了一周咕了好几场cf,突然想起这题没补然而一直都不会
于是去杯橘猫那里偷学了一手https://blog.csdn.net/ccsu_cat/article/details/101731113
#include<bits/stdc++.h>
#define maxl 310
const int mod=1e9+7;
int n,k;
long long jc[maxl],inv[maxl],qpk[maxl],qpk1[maxl];
long long dp[maxl][maxl];
inline long long qp(long long a,long long b)
{
long long ans=1,cnt=a;
while(b)
{
if(b&1)
ans=ans*cnt%mod;
cnt=cnt*cnt%mod;
b>>=1;
}
return ans;
}
inline void prework()
{
scanf("%d%d",&n,&k);
jc[0]=1;inv[0]=1;
for(int i=1;i<=n;i++)
{
jc[i]=jc[i-1]*i%mod;
inv[i]=qp(jc[i],mod-2);
}
qpk[0]=qpk1[0]=1;
for(int i=1;i<=n;i++)
{
qpk[i]=qpk[i-1]*k%mod;
qpk1[i]=qpk1[i-1]*(k-1)%mod;
}
}
inline long long c(long long n,long long r)
{
if(r>n)
return 0;
if(r==n)
return 1;
return jc[n]*inv[r]%mod*inv[n-r]%mod;
}
inline void add(long long &a,long long b)
{
a=((a+b)%mod+mod)%mod;
}
inline void mainwork()
{
for(int i=1;i<=n;i++)
dp[1][i]=c(n,i)*qp(k-1,n-i)%mod;
for(int i=2;i<=n;i++)
for(int p=1;p<=n;p++)
{
for(int j=1;j<=p-1;j++)
add(dp[i][p],dp[i-1][j]*qpk[j]%mod*c(n-j,p-j)%mod*qpk1[n-p]%mod);
add(dp[i][p],dp[i-1][p]*((qpk[p]-qpk1[p]+mod)%mod)%mod*qpk1[n-p]%mod);
}
}
inline void print()
{
printf("%lld",dp[n][n]);
}
int main()
{
prework();
mainwork();
print();
return 0;
}