CSP-S 2019 Emiya 家今天的饭

Posted hock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSP-S 2019 Emiya 家今天的饭相关的知识,希望对你有一定的参考价值。

( ext {Emiya 家今天的饭})

Emiya 不会让大家饿肚子,所以将做至少一道菜,即 (kgeq1)
Rin 希望品尝不同烹饪方法做出的菜,因此她要求每道菜的烹饪方法互不相同
Yazid 不希望品尝太多同一食材做出的菜,因此他要求每种主要食材至多在一半的菜(即(?k /2?)道菜)中被使用

subtask1 ( ext {期望得分 64pts})

(f[i][j][k][l])(j, k, l)分别表示每一列选多少数就行了

subtask2 ( ext {期望得分 84pts})

考虑到有且只有一列所选的东西会大于(?k /2?)个 即不满足条件

我们可以用容斥定理 用所有情况-不满足条件情况就行了

我们先钦定(t) 为选数最多的一列 (f[i][j][k])表示选到了第(i)行最多的一行用了(j)个 其余列总共选了(k)个 答案不满足条件 当切仅当(j > k)

转移比较容易
[f[i][j][k] = f[i - 1][j][k] + f[i - 1][j - 1][k] * a[i][t] + f[i - 1][j][k - 1] *(s[i] - a[i][t])]

for (int t = 1; t <= m; t ++ ) { 
    memset (f, 0, sizeof (f)); 
    f[0][0][0] = 1; 
    for (int i = 1; i <= n; i ++ ) { 
        for (int j = 0; j <= i; j ++ ) { 
            for (int k = 0; k <= i - j; k ++ ) { 
            f[i][j][k] = f[i - 1][j][k]; 
            if (j) Add (f[i][j][k], f[i - 1][j - 1][k] * a[i][t] % mod); 
            if (k) Add (f[i][j][k], f[i - 1][j][k - 1] % mod * (s[i] % mod - a[i][t] % mod + mod) % mod); 
            f[i][j][k] %= mod; 
            } 
        } 
    } 
    for (int i = 1; i <= n; i ++ ) 
        for (int j = 0; j <= n - i; j ++ ) 
            if (i > j) Add(wrong, f[n][i][j]); 
}

时间复杂度(O(n^3 *m))

std ( ext {期望得分 100pts})

考虑如何优化(f[i][j][k])可以直接用差值优化一下

(f[i][j - k])表示选到第几行 最多的一行减去其他行的值为(j - k)

考虑(j - k)可能为负数 所以我们可以集体向右移(n) 然后就行了

[f[i][j] = f[i -1][j] + f[i - 1][j + 1] * a[i][t] + f[i - 1][j - 1]*(s[i]-a[i][t])]

int main () {
    read (n); read (m);
    ll ans = 1;
    for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) read (a[i][j]), s[i] += a[i][j], s[i] %= mod;
    for (int i = 1; i <= n; i ++ ) ans = (ans * (s[i] + 1)) % mod;
    for (int t = 1; t <= m; t ++ ) {
        memset (f, 0, sizeof (f));
        f[0][n] = 1;
        for (int i = 1; i <= n; i ++ ) {
            for (int j = n - i; j <= n + i; j ++ ) {
                Add (f[i][j], (f[i - 1][j] + f[i - 1][j + 1] * (s[i] - a[i][t]) % mod) % mod);
                if (j >= 1) Add (f[i][j], f[i - 1][j - 1] * a[i][t] % mod);
            }
        }
        for (int i = n + 1; i <= n * 2; i ++ ) Add (wrong, f[n][i]);
    }
    write ((ans % mod - wrong % mod + mod - 1 + mod) % mod);
    return 0;
}

分析

(64)难度不大 考场上心态不炸很好拿 难度普及+

(84)分需要分析性质 难度提高

(84->100)需要经过思考 难度提高+

以上是关于CSP-S 2019 Emiya 家今天的饭的主要内容,如果未能解决你的问题,请参考以下文章

JZOJ6433luoguP5664CSP-S2019Emiya 家今天的饭

CSP2019 Emiya 家今天的饭

csp2019 Emiya家今天的饭题解

CSP-S2019-day2

CSP2019复赛游记

$CSP$ $2019$ $Day2$ 模拟考试 题解报告