zoukankan      html  css  js  c++  java
  • CF1228E Another Filling the Grid

    Description

    题目链接

    (k) 个数填进 (n imes n) 的网格中,要求每行每列的最小值均为 (1) ,求合法方案数对 (10^9+7) 取模的结果

    (1le nle 250,1le kle 10^9)

    Solution

    看着标签是 ( ext{combinatorics})( ext{dp}) 就看了看题目......

    考虑从左向右 ( ext{dp}) ,每列至少有一个 (1) ,同时考虑行的情况。对于某一列如果填完了 (1) ,那剩下的位置直接随便填非 (1) 的数就行了,设 (dp_{i,j}) 表示到了第 (i) 列,还有 (j) 行没有填 (1) 的方案数,方程就是

    [dp_{i,j}=dp_{i-1,j}(k-1)^j(k^{n-j}-(k-1)^{n-j})+sumlimits_{p=1}^{n-j}dbinom{j+p}{p}dp_{i-1,j+p}k^{n-j-p}(k-1)^j ]

    其中 (k^{n-j}-(k-1)^{n-j}) 是为了保证这一列至少有一个 (1)

    复杂度 (O(n^3))

    代码如下:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int N=3e2+10;
    const int mod=1e9+7;
    int n,k,dp[N][N],c[N][N],bin[N],bin2[N];
    inline void Add(int &x,int y){x+=y;x-=x>=mod? mod:0;}
    inline int Minus(int x){x+=x<0? mod:0;return x;}
    inline int MOD(int x){x-=x>=mod? mod:0;return x;}
    inline void Preprocess(){
    	for(register int i=0;i<=n;i++){
    		c[i][0]=1;
    		for(register int j=1;j<=i;j++)
    			c[i][j]=MOD(c[i-1][j]+c[i-1][j-1]);
    	}
    	bin[0]=1;for(register int i=1;i<=n;i++)bin[i]=1ll*bin[i-1]*k%mod;
    	bin2[0]=1;for(register int i=1;i<=n;i++)bin2[i]=1ll*bin2[i-1]*(k-1)%mod;
    }
    int main(){
    	scanf("%d%d",&n,&k);Preprocess();dp[0][n]=1;
    	for(register int i=1;i<=n;i++)
    		for(register int j=0;j<=n;j++){
    			Add(dp[i][j],1ll*dp[i-1][j]*bin2[j]%mod*(Minus(bin[n-j]-bin2[n-j]))%mod);
    			for(register int p=1;p<=n-j;p++)
    				Add(dp[i][j],1ll*c[j+p][p]*dp[i-1][j+p]%mod*bin[n-j-p]%mod*bin2[j]%mod);
    		}
    	printf("%d
    ",dp[n][0]);
    	return 0;
    }
    
  • 相关阅读:
    文件转换table
    日期选择
    下拉多选
    下载文件(简洁方法)
    服务器下载文件http
    文件名称 (年4+月2+日2+时2+分2+秒2+毫秒3+8位随机数)
    Vim自动补全神器:YouCompleteMe
    Linux下如何卸载HP_LoadGenerator
    python 安装 setuptools Compression requires the (missing) zlib module 的解决方案
    linux安装IPython四种方法
  • 原文地址:https://www.cnblogs.com/ForwardFuture/p/11610829.html
Copyright © 2011-2022 走看看