闲话 23.2.28
闲话
首先声明一个事情
不是我教的
SoyTony 和我说 真实情况是他先后问了关于世末歌者和春卷饭的问题
反正我相信这一版(
我的确没和他在同一段对话里谈到这两个关键词是真的
upd2:SoyTony 说他希望我删掉
随后 SoyTony 瑞平了虚拟主播
我不太记得原话了就不写了
不是啥好词
upd:SoyTony 说他希望我删掉 懂的都懂
upd2:不是加在这的
SoyTony:
你就写我瑞平虚拟主播 瑞平虚拟歌手 瑞平原
我瑞平一切 你快把我开盒
Keven_He:?
我闲话里提到世末歌者的两个地方
一个是标明原作者的推歌
另一个是推鬼面老师用 AI 绫重调的 我也标了 p 主
Again ABC String 这题我盯了好久了
因为是金牌 所以一直没写
由于某大佬的闲话一直没写这题
所以我写了(
别急,马上会写的!
奇怪图
今日推歌:世末歌者 - COP feat. 乐正绫
人潮仍是漫无目的地向目的地散去
忙碌着 无为着 继续
模拟赛
演了一上午 真爽
好随性啊这题解
T1
给个大数 \(s\),问 \(n\le 5\times 10^4\) 满足 \(n^n = s\)。
两个做法,一个是对质数取模实现哈希,另一个是 \(s\) 的位数是 \(\lfloor n\lg n \rfloor + 1\)。都可以很快实现。
T3
把每个数的平方因子删掉 每个数都可以表示成 \(p\times q, p > 1, q \ge 1\),\(p, q\) 为质数。
每个质数建点,\(p, q > 1\) 时 \(p, q\) 连边即可。对 \(q = 1\) 的情况,我们新建超级源点,让 \(p\) 连在源点上。
答案就是这样成图的最小环。由于图的结构,我们断定答案的环一定经过前 \(\sqrt n\) 个节点。直接做即可。
总时间复杂度为 \(O(\sqrt n \pi (n))\)。
不会写找最小环?可以写个普通的找环,然后不断 shuffle 边集 vector,再做。本题数据下 shuffle 十遍即可。
T4
不会。
考虑状压。设 \(f(i, S)\) 为进行了 \(i\) 次攻击,还活着的随从集合是 \(S\),则每次转移枚举新攻击的随从,枚举是否死亡。
如果死亡了就提出 \(a_i - 1\) 次攻击,反之需要保证 \(i\le \sum(a_i - 1)\)。最后概率乘以 \(1 / |S|\)。
上面的东西算出来后考虑最终分配伤害方案。设 \(g(i)\) 是剩下 \(i\) 点伤害没分配时的方案数,每次选择随从乘组合数转移即可。最终可以转移的方案数就是 \(g(0)\)。
总时间复杂度为 \(O(2^n nm)\)。
code
#include <bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
#define pre(i,s,t) for (register int i = (s), i##_ = (t) - 1; i > i##_; -- i)
const int N = 2e2 + 10;
int n, m, V, a[N], f[N][1 << 15 | 3], g[N], ret;
signed main() {
cin >> n >> m; rep(i,0,n - 1) cin >> a[i]; V = (1 << n) - 1;
f[0][V] = 1;
rep(i,0,m-1) rep(s,1,V) if (f[i][s]) {
int tmp = i, sum = 0, c = __builtin_popcount(s);
rep(u,0,n-1) {
if (s >> u & 1) sum += a[u];
else tmp -= a[u];
}
rep(u,0,n-1) if (s >> u & 1 and tmp >= a[u] - 1)
addi(f[i + 1][s ^ (1 << u)], mul(f[i][s], inv(c), C(tmp, a[u] - 1)));
if (i < sum - c)
addi(f[i + 1][s], mul(f[i][s], inv(c)));
}
rep(s,1,V) if (f[m][s]) {
int tmp = m, sum = 0;
rep(u,0,n-1) {
if (s >> u & 1) sum += a[u];
else tmp -= a[u];
} memset(g, 0, sizeof g);
g[tmp] = 1;
rep(u,0,n-1) if (s >> u & 1) rep(i,1,tmp) rep(x,1,min(i, a[u] - 1))
addi(g[i - x], mul(g[i], C(i, x)));
addi(ret, mul(__builtin_popcount(s ^ V), f[m][s], g[0]));
} cout << ret << '\n';
}
杂题
有 \(T\) 组询问,每组询问给定 \(n, X, Y, Z\)。你需要计数满足如下条件的字符串 \(S\):
- 长度为 \(n\);
- 只包含
A
、B
和C
;- 令 \(S_i\) 为 \(S\) 的前 \(i\) 个字符组成的串,\(A_i, B_i, C_i\) 分别为 \(S_i\) 中
A
B
C
的数量。对每个 \(1\le i\le n\) 有
- \(A_i - B_i\le X\);
- \(B_i - C_i\le Y\);
- \(C_i - A_i\le Z\)。
答案对 \(\bm 2\) 取模。
\(T\le 10,\ 1\le n\le 10^9, \ 0\le X, Y, Z\le 10^9\)。
考虑题意转化。重述题意如下:
在一个长度为 \(m = X + Y + Z + 3\) 的环上有三个人,分别处于 \(0, X + 1, X + Y + 2\) 的位置。你需要执行 \(n\) 次操作,每次操作指定一个人向正方向走 \(1\) 步,在这过程中要求任意两个人的位置不可重合。问可能的操作序列方案数。
不妨确定最终状态而不是初始状态。把过程倒转,考虑 dp 从任意位置开始,结束于 \(0, X + 1, X+Y+2\) 的方案数。可以直接写出 \(f(k, i, j)\) 表示走了 \(k\) 步,一/二人、二/三人间隔是 \(i, j\),且 \(i, j\neq 0, i + j < m\)。考虑某人走了一步可以得到
初值就是 \(\forall i, j, \ f(0, i, j) = 1\),答案就是 \(f(n, X+1,Y+1)\)。这可以得到 \(O(nm^2)\) 的复杂度。这显然过不去。
考虑特殊条件,也就是模 \(2\) 意义下的性质。设任意 \(i, j\neq 0, i + j< m\) 都有 \(f(k, i, j) = f(k, m - i, m - j)\)。考虑让后两维在模 \(m\) 意义下进行,我们能注意到不合法位置的 dp 值恰好为 0。
这样我们就可以将这转移写成 gf 风格了。考虑 \(F_k(x, y)\) 是对 \(f(k, i, j)\) 的二三维求和得到的 bgf,有转移
初值可以写作
设 \(G(x, y) = \dfrac{1}{x} + \dfrac{x}{y} + y\),答案就是 \([x^{X + 1}y^{Y + 1}] \left(F_0G^n \text{ mod }{(x^m - 1)(y^m - 1)}\right)\)。
我们不妨分别考虑 \(F_0\) 中的四项,讨论他们的贡献。
对于第一项,它的意义就是操作序列总方案数,也就是 \(3^n\),这显然是奇数,在 \(\bmod\ 2\) 意义下为 \(1\)。
对于第二项,由于 \(x\) 取到了所有可能的值,所以实际上我们需要求的就是 \([y^{Y + 1}] G(1, y)^n\)。第三项类似。
对于第四项,通过与第二项类似的考察能发现,我们要求的就是 \([x^{X + Y + 2}] G(x, 1)^n\)。
由于 \(G(x, 1)\) 和 \(G(1, y)\) 是同构的,原问题已经被转化为了如下的问题:
求 \(\left(x + 1 + \dfrac{1}{x}\right)^n \pmod{x^m + 1}\) 的第 \(k\) 项系数模 \(2\) 的值。
很容易想到通过 Kummer 定理简化问题。设 \(n = \sum_i 2^{a_i}\),并 \(n_i = 2^{a_i}\)。显然有 \(i\) 的范围是 \(O(\log n)\) 的。则原题意就是求 \(\prod_i \left(x^{n_i} + 1 + x^{-n_i}\right) \pmod{x^m + 1}\) 的第 \(k\) 项系数模 \(2\) 的值。
在 \(m\) 较小时可以考虑直接通过循环卷积暴力计算如上的多项式,复杂度是单次 \(O(m)\),总 \(O(m\log n)\) 的。题解说 \(m\) 较小时也需要 dp 啊,我对这不是很懂。
在 \(m\) 较大时我们不妨考虑枚举 \(c\),提取 \(\prod_i \left(x^{2n_i} + x^{n_i} + 1\right)\) 的 \(cm + k + n\) 项系数。可以用数位 dp 统计每个三项式的选法,在单次 \(O(\log n)\),总 \(O(\frac{n}{m} \log n)\) 的复杂度内解决该问题。
因此对 \(m\) 作根号分治可以在 \(O(\sqrt n \log n)\) 的复杂度内解决这问题,这也在同复杂度内解决了原问题。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230228.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。