Jzoj P4779 鞍点___组合数+容斥+dp

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/Gx_Man_VIP/article/details/88647155

题目大意:

在这里插入图片描述
1 n , m 2000 1 k 10 1 l 1 e 9 1≤n,m≤2000,1≤k≤10,1≤l≤1e9

分析:

d p i , j dp_{i,j} 表示矩阵中至少存在 j j 个鞍点,且这些点的数值≤ i i 时矩阵的方案数。
考虑如何转移:
假设我们当前的 d p i , j dp_{i,j} 而言,我再加入 r r 个数值为 i + 1 i+1 的鞍点,
那么这些鞍点能够放的位置的方案数即: C ( n j , r ) C ( m i , r ) r ! C(n−j,r)∗C(m−i,r)∗r!
然后它们所占用的行列的其他格子显然只能取 [ 1 , i ] [1,i] 的数值,即有 i ( m j ) r + ( n j ) r r 2 r i^{(m−j)∗r+(n−j)∗r−r^2-r} 种方案
最后统计答案的时候呢,
注意到 d p i , j dp_{i,j} 中除去这 j j 个我人为放下的鞍点以外,还有 ( n j ) ( m j ) (n-j)*(m-j) 个位置未放置且能够任意放置 [ 1 , k ] [1,k] 的数值,那么 d p i , j dp_{i,j} 乘上 k ( n j ) ( m j ) k^{(n-j)*(m-j)}
答案要容斥后即为 i = 1 m i n ( n , m ) f [ k ] [ i ] ( 1 ) i + 1 ∑_{i=1}^{min(n,m)}f[k][i]∗(−1)^{i+1}

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cmath>
#include <algorithm>

#define N 2005

using namespace std;

typedef long long ll;

ll dp[N][N], mi[11][N*N], c[N][N], jc[N], mo, ans;
int n, m, K, num, x;

int main()
{
    scanf("%d %d %lld %lld", &n, &m, &K, &mo);
    c[0][0] = 1;
    for (int i = 1; i <= 2000; i++) 
    {
        c[i][0] = 1;
        for (int j = 1; j <= i; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mo;
    }

	for (int j = 0; j <= K; j++)
    {
        mi[j][0] = 1;
        for (int i = 1; i <= n * m; i++)
            mi[j][i] = (ll)mi[j][i - 1] * j % mo;
    }
    
    num = min(n, m);
    jc[0] = 1; for (int i = 1; i <= num; i++) jc[i] = (ll)jc[i - 1] * i % mo;
    
    
	dp[0][0] = 1;
    for (int i = 0; i < K; i++)
        for (int j = 0; j <= num; j++)
        if (dp[i][j])
           for (int k = 0; k <= num - j; k++)
               dp[i + 1][j + k]= (dp[i + 1][j + k] + dp[i][j] * c[n - j][k] % mo * c[m - j][k] % mo * jc[k] % mo * mi[i][(m - j) * k + (n - j) * k - k * k - k] % mo) % mo;
    
    int j; 
    for (int i = 1; i <= num; i++)
    {
        if (i % 2 == 1) j = 1; else j = -1;
        ans = ((ans + dp[K][i] * mi[K][(m - i) * (n - i)] % mo * j) % mo + mo) % mo;
    }
    printf("%lld\n", ans);
}

猜你喜欢

转载自blog.csdn.net/Gx_Man_VIP/article/details/88647155