
日记
都半期了我怎么还那么菜!!!
Counting RhymeLink to
我们设 表示 里是否有 的因子, 表示有几组 。显然这两个东西都可以在 的复杂度内求解,那么最终的复杂度就是 。甚至还比 优。
Non-Intersecting SubpermutationsLink to
2024/5/14 做过。好臭的日期
我们设 表示在前 个数里,第 个数内没有重复的情况下的贡献。答案就是 。
我们考虑如何转移。我们想两种情况:第 位是否在 这不重复的 个里面。如果不在,那么就会增加 的贡献。如果在,我们考虑枚举这个数在哪里重复了,增加 的贡献。
放一下代码:
CPP
1234567891011121314151617181920212223242526272829
#include<bits/extc++.h>
#define int long long
using 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 ProblemLink to
我们看到:异或??!MEX??!考虑不做。
这俩恶心扒拉的东西凑一起了,我们不做也得做。
看到异或,我们的最优性 dp 直接原地爆炸,考虑可行性 dp。我们发现, 以下数再怎么也异或不出大于 的数,更适合可行性 dp 了。设 表示前 个数能否异或出 。考虑转移:枚举上一段的结尾 ,那么有 。但是这样有 的复杂度,显然不可行。
考虑优化:我们定义一种东西叫“好的区间”,其意义为:对于区间 ,不存在区间 使得 。可以证明这种区间只有 个,然而我并不会。于是我们只用转移这些个好的区间,时间复杂度 。
后日谈 Link to 后日谈
即使注定失败,你也会坚持下去吗?
反正我会。
日记
© 伊埃斯 | CC BY-NC-SA 4.0