AT_abc321_f 题解
题意
有一个可重集合
操作次数,不超过
解法
这十分甚至九分地像一个生成函数的形式,把它写出来,则答案的生成函数为
它的
赛时妄想用 NTT 直接求能过,浪费 25min,外加一发罚时,警钟长鸣,不要低估 NTT 等的常数。
你发现这个东西多乘上一个元素
然后考虑删去元素
设删去
放到每一项系数中,就有
其中
显然有
时间复杂度
代码
极度舒适。
#include <iostream>
#include <cstdio>
#include <vector>
#pragma GCC optimize(2)
using namespace std;
const int mod = 998244353;
int a[5005], k, q;//a[i] 是多项式的系数
int main(){
cin >> q >> k;
a[0] = 1;
while(q--){
char op;
int x;
cin >> op >> x;
if(op == '+')
for(int i = 5000; i >= x; i--)
(a[i] += a[i - x]) %= mod;
else
for(int i = x; i <= 5000; i++)
(a[i] += mod - a[i - x]) %= mod;
//注意顺序,一正一反
cout << a[k] << endl;
}
return 0;
}