都半期了我怎么还那么菜!!!
Counting Rhyme↗
我们设 表示 里是否有 的因子, 表示有几组 。显然这两个东西都可以在 的复杂度内求解,那么最终的复杂度就是 。甚至还比 优。
Non-Intersecting Subpermutations↗
2024/5/14 做过。好臭的日期
我们设 表示在前 个数里,第 个数内没有重复的情况下的贡献。答案就是 。
我们考虑如何转移。我们想两种情况:第 位是否在 这不重复的 个里面。如果不在,那么就会增加 的贡献。如果在,我们考虑枚举这个数在哪里重复了,增加 的贡献。
放一下代码:
#include<bits/extc++.h>#define int long longusing namespace std;const int mod = 998244353;int n,k;int dp[4005][4005],pw[4005];signed main(){ cin >> n >> k; pw[0] = 1; for (int i = 1; i <= n; i++) pw[i] = pw[i - 1] * k % mod; dp[1][1] = k; int ans = 0; for (int i = 2; i <= n; i++) { int tmp = 0; dp[i - 1][0] = dp[i - 1][k];// 我不明白 for (int j = k; j >= 1; j--) { if (j != k) tmp = (tmp + dp[i - 1][j]) % mod; dp[i][j] = (dp[i - 1][j - 1] * (k - j + 1) + tmp) % mod; } ans = (ans + dp[i][k] * pw[n - i]) % mod; } cout << ans; return 0;}我不明白:为啥要 dp[i - 1][0] = dp[i - 1][k]?
Another MEX Problem↗
我们看到:异或??!MEX??!考虑不做。
这俩恶心扒拉的东西凑一起了,我们不做也得做。
看到异或,我们的最优性 dp 直接原地爆炸,考虑可行性 dp。我们发现, 以下数再怎么也异或不出大于 的数,更适合可行性 dp 了。设 表示前 个数能否异或出 。考虑转移:枚举上一段的结尾 ,那么有 。但是这样有 的复杂度,显然不可行。
考虑优化:我们定义一种东西叫“好的区间”,其意义为:对于区间 ,不存在区间 使得 。可以证明这种区间只有 个,然而我并不会。于是我们只用转移这些个好的区间,时间复杂度 。
后日谈
即使注定失败,你也会坚持下去吗?
反正我会。
Thanks for reading!
