初見安~這裡是傳送門:洛谷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 開始忘...