题面
如果只考虑行不相同,答案显然为
(cM)N−
。
再考虑列不相同的情况,把相同的列看成一个等价类,至多
i
个等价类
设恰好
i
个等价类的方案为
F(M)=∑i=1M{Mi}G(i)
根据stirling反演,有
G(M)=∑i=1M(−1)M−i[Mi]F(i)
O(n2) 暴力计算即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int mod=1004535809;
ll n,m,c,S1[5010][5010],mi[5010],lim[5010];
int main()
{
int ca;
scanf("%d",&ca);
S1[0][0]=1;
for(int i=1;i<=5000;i++)
for(int j=1;j<=i;j++)
S1[i][j]=(S1[i-1][j]*(i-1)+S1[i-1][j-1])%mod;
while(ca--)
{
scanf("%lld%lld%lld",&n,&m,&c);
mi[0]=1;
for(int i=1;i<=m;i++)
mi[i]=mi[i-1]*c%mod;
ll ans=0;
for(int i=m,f=1;i>=0;i--,f=-f)
{
ll cal=1;
for(int j=0;j<n;j++)
cal=cal*(mi[i]-j+mod)%mod;
ans=(ans+S1[m][i]*cal%mod*f+mod)%mod;
}
printf("%lld\n",ans);
}
return 0;
}