【jzoj3892】【放棋子】【数论】【第二类斯特林数】

来源:互联网 发布:淘宝直通车测图教程 编辑:程序博客网 时间:2024/06/05 20:11

题目大意

这里写图片描述

解题思路

考虑强制i行j列一定不放,其他可放可不放,用组合数处理一下。考虑剩下的涂什么颜色,就是将n个不同的数放到m个集合,是第二类斯特林数,阶乘处理一下。

code

#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define LF double#define LL long long#define min(a,b) ((a<b)?a:b)#define max(a,b) ((a>b)?a:b)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=400,mo=1e9+7;int n,m,C,c[maxn+10][maxn+10],fact[maxn+10],f[maxn*maxn+10][maxn+1];int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d%d%d",&m,&n,&C);    fo(i,0,maxn){        c[i][0]=1;        fo(j,1,i)c[i][j]=(1ll*c[i-1][j-1]+c[i-1][j])%mo;    }    fact[0]=1;fo(i,1,maxn)fact[i]=(1ll*fact[i-1]*i)%mo;    f[0][0]=1;fo(i,1,maxn*maxn)fo(j,1,maxn)f[i][j]=(1ll*f[i-1][j]*j+f[i-1][j-1])%mo;    int ans=0;    fo(i,0,n)fo(j,0,m){        int x=((1ll*fact[C+1]*f[(n-i)*(m-j)][C+1]%mo+1ll*fact[C]*f[(n-i)*(m-j)][C]%mo)%mo);        ans=(ans+(((i+j)&1)?-1ll:1ll)*c[n][i]*c[m][j]%mo*((1ll*fact[C+1]*f[(n-i)*(m-j)][C+1]%mo+1ll*fact[C]*f[(n-i)*(m-j)][C]%mo)%mo)%mo)%mo;        int bb;        bb++;    }    printf("%d",(ans%mo+mo)%mo);    return 0;}
0 0
原创粉丝点击