HDU - 6314:Matrix (广义容斥)(占位)

Posted hua-dong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 6314:Matrix (广义容斥)(占位)相关的知识,希望对你有一定的参考价值。

Samwell Tarly is learning to draw a magical matrix to protect himself from the White Walkers.
the magical matrix is a matrix with n rows and m columns, and every single block should be painted either black or white.
Sam wants to know how many ways to paint the matrix, satisfied that the final matrix has at least A rows, B columns was painted completely black. Cause the answer might be too big, you only need to output it modulo 998244353.

InputThere might be multiple test cases, no more than 5. You need to read till the end of input.
For each test case, a line containing four integers n,m,A,B.
1n,m,A,B3000 1≤n,m,A,B≤3000 .
OutputFor each test case, output a line containing the answer modulo 998244353.
Sample Input

3 4 1 2

Sample Output

169

题意:给N*M的空白格子染色,求至少x行,至少y列被染色的方案数。

思路:不会,占位。

技术分享图片
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 3001;
const int MOD = 998244353;
int n, m, A, B, ans;
int C[maxn][maxn], two[maxn * maxn];
int fa[maxn], fb[maxn];

void Init() {
    for(int i = 0; i < maxn; ++i) {
        for(int j = 0; j <= i; ++j) {
            if(j == i || j == 0) {
                C[i][j] = 1;
            } else {
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
                if(C[i][j] >= MOD) {
                    C[i][j] -= MOD;
                }
            }
        }
    }
    two[0] = 1;
    for(int i = 1; i < maxn * maxn; ++i) {
        two[i] = two[i - 1] * 2;
        if(two[i] >= MOD) {
            two[i] -= MOD;
        }
    }
}

int main() {
    Init();
    while(~scanf("%d%d%d%d", &n, &m, &A, &B)) {
        ans = 0;
        for(int i = A; i <= n; ++i) {
            fa[i] = 0;
            for(int j = A; j < i; ++j) {
                fa[i] = (fa[i] + (LL)C[i][j] * fa[j]) % MOD;
            }
            fa[i] = 1 - fa[i];
            if(fa[i] < 0) {
                fa[i] += MOD;
            }
        }
        for(int i = B; i <= m; ++i) {
            fb[i] = 0;
            for(int j = B; j < i; ++j) {
                fb[i] = (fb[i] + (LL)C[i][j] * fb[j]) % MOD;
            }
            fb[i] = 1 - fb[i];
            if(fb[i] < 0) {
                fb[i] += MOD;
            }
        }
        for(int i = A; i <= n; ++i) {
            LL tmp = (LL)fa[i] * C[n][i] % MOD;
            for(int j = B; j <= m; ++j) {
                ans = (ans + ((tmp * fb[j] % MOD) * C[m][j] % MOD) * two[(n - i) * (m - j)] % MOD) % MOD;
            }
        }
        printf("%d
", ans);
    }

    return 0;
}
View Code

 

以上是关于HDU - 6314:Matrix (广义容斥)(占位)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2839 集合计数 容斥广义容斥

「总结」容斥。三.广义容斥

luogu 5505 [JSOI2011]分特产 广义容斥

luoguP4491 [HAOI2018]染色 广义容斥原理 + FFT

杭电2018多校第四场(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -

POJ 2155 Matrix(树状数组+容斥原理)