CSP2019 Emiya 家今天的飯

2022-05-06 23:24:09 字數 1248 閱讀 9595

鏈結

顯然根據性質最多的菜品不超過總數量的一半,可以考慮補集轉化

即計算有乙個菜品超過數量一半的方案數,再用總方案數減

總方案數顯然可以乙個揹包搞定(然而我去年就是因為總方案數沒求對掛了)

然後考慮求超過一半的方案數

列舉當前哪個菜品是超過一半的

有乙個顯然的dp:

$ f_ $ 表示當前到第i行最多的菜品選了j個,其餘的選了k個的方案數

但是這樣會t

考慮能否優化

注意到我們需要的狀態並不需要知道菜品的具體數量,只需要要求菜品的相對數量關係

於是可以列舉相對數量關係來壓縮一維

#includeusing

namespace

std;

#define ll long long inline ll read()

while(ch <'

0'||ch >'9'

);

dowhile(ch >= '

0' && ch <= '9'

);

return f*x;

}const

int mod = 998244353

;const

int maxn = 100 + 10

;const

int maxm = 2000 + 10

;int

n,m;

ll a[maxn][maxm];

ll tot_meal;

ll f[maxn],s[maxn];

ll dp[maxn][maxn

<<1

];int

main()}f[

0] = 1

;

for(int i=1;i<=n;i++)

for(int j=i;j>=1;j--)

f[j] = (f[j] + f[j-1] * s[i] % mod) %mod;

for(int i=1;i<=n;i++) tot_meal += f[i] ,tot_meal %=mod;

//cout << tot_meal << endl;

ll ans =tot_meal;

for(register int cur=1;cur<=m;cur++)

}for(int j=n+1;j<=2*n;j++) ans = (ans - dp[n][j] + mod) %mod;

}cout

<< ans <}

csp2019 Emiya家今天的飯

作為提高組d2t 1d2t1 d2t1 比去年難 所以這道題我打的特別的差 這道題我們很顯然可以看到可以打乙個暴力 複雜度o n n o n n o n n 我考場上就達到了這裡 我太菜了 void dfs int u,ll plus dfs u 1,plus rep i,1 m if a u i ...

CSP2019 Emiya 家今天的飯

題面 luogu 題解 容斥 dp 首先題意是這樣的 給乙個 n times m 的矩陣,每一行只能選乙個,每一列選的總數不能超過選的總數的一半。求總方案數 考慮容斥 總方案數減去不合法方案數 總方案數顯然 設每一行的總數為 sum i ans prod sum i 1 1 減一是因為不能不做乙個菜...

csp2019 Emiya家今天的飯題解

qwq 由於窩太菜了,實在是不會,所以在題解的幫助下過掉了這道題。寫此部落格來整理一下思路 傳送簡化一下題意 現在有 n 行 m 列數,選 k 個數的合法方案需滿足 1.一行最多選乙個 2.一列最多選 lfloor frac rfloor 個數 當然,如果你在某一行裡選了0,就相當於沒有在這一行裡選...