洛谷 bzoj 已經沒有什麼好害怕的了

2021-10-01 16:02:17 字數 1555 閱讀 9507

初見安~這裡是傳送門:洛谷p4859 & bzoj p3622

這就是個廣義容斥定理的板子題了。說白了就是假設有n個物品,求剛好k個滿足某個性質時的演算法。【不做解釋了。

這個題要求糖果能量》藥片的情況數要大於反之的情況數剛好k組。也就是說:

假設有x組糖果》藥片,y組反之,則:

所以首先n+k為奇數就無解。其次,我們要求的就是剛好有

由廣義容斥,我們首先要求得至少有i組滿足該性質時的數量。這個我們首先可以用計數dp解決——。狀態很好轉移——

即:要麼該糖不做貢獻,要麼整個能量小於它的藥片,而剩餘的可以小於它的藥片數有cnt[i]-(j-1)個。

所以就有:

然後套廣義容斥即可。

#include#include#include#include#include#include#define maxn 2005

using namespace std;

typedef long long ll;

const int mod = 1e9 + 9;

const int mx = 2e3 + 2;

int read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();

return x * f;}

ll fac[maxn], inv[maxn];

ll pw(ll a, ll b) return res;}

ll c(ll n, ll m)

ll ans = 0, f[maxn][maxn], alpha[maxn];

int n, k, cd[maxn], md[maxn], cnt[maxn];

signed main()

for(int i = 0; i <= n; i++) f[i][0] = 1;

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

f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * max(0, cnt[i] - j + 1)) % mod;

k = (n + k) >> 1;//所求要滿足的性質數

for(int i = 1; i <= n; i++) alpha[i] = f[n][i] * fac[n - i] % mod;//這i組滿足後,其餘隨便放

for(int i = k, kd = 1; i <= n; i++, kd = -kd)

ans = (ans + kd * alpha[i] * c(i, k) + mod) % mod;//廣義容斥啊,可理解為i個里固定k個滿足要求

printf("%lld\n", ans);

return 0;

}

迎評:)

——end——

已經沒有什麼好害怕的了

給定乙個長度為n 只包含左括號和右括號的序列,求每乙個位置經過的合法子串有多少個。空串是乙個合法的串,如果a 和b 都是合法的串,那麼 a 和ab 都是合法的串。令a ns i 為第 i 位的答案,對於每組資料,輸出乙個整數an s 1 n an s i imo d p p 1 9 7 n 10 6...

已經沒有什麼好害怕的了

description 小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法...

bzoj 3622 已經沒有什麼好害怕的了

我好害怕這種題 兩個陣列排序後,處理出next i 表示滿足tang i yao j 的最大的j。f i j 前i種糖果,有j個糖比藥多,不考慮剩餘情況的方案數 也就是剩餘n j個糖果的放法算一種,最後乘上階乘。f i j f i 1 j f i 1 j 1 max next i j 1,0 開始忘...