闲话

首先声明一个事情
不是我教的
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\)。都可以很快实现。

T2

T3
把每个数的平方因子删掉 每个数都可以表示成 \(p\times q, p > 1, q \ge 1\)\(p, q\) 为质数。
每个质数建点,\(p, q > 1\)\(p, q\) 连边即可。对 \(q = 1\) 的情况,我们新建超级源点,让 \(p\) 连在源点上。
答案就是这样成图的最小环。由于图的结构,我们断定答案的环一定经过前 \(\sqrt V\) 个节点。直接做即可。
总时间复杂度为 \(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';
} 

杂题

ARC147F

\(T\) 组询问,每组询问给定 \(n, X, Y, Z\)。你需要计数满足如下条件的字符串 \(S\)

  • 长度为 \(n\)
  • 只包含 ABC
  • \(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\)。考虑某人走了一步可以得到

\[f(k, i, j) = f(k - 1, i - 1, j) + f(k - 1, i + 1, j - 1), f(k - 1, i, j + 1)
\]

初值就是 \(\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,有转移

\[F_k(x, y) = F_{k - 1}(x, y) \left( \frac{1}{x} + \frac{x}{y} + y \right) \pmod{(x^m - 1)(y^m - 1)}
\]

初值可以写作

\[F_0(x, y) = \sum_{i = 0}^{m - 1}\sum_{j = 0}^{m - 1} x^i y^j - \sum_{i = 0}^{m - 1} x^i - \sum_{i = 0}^{m - 1}y^i - \sum_{i = 0}^{m - 1} x^i y^{m - i}
\]

\(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\) 较大时我们不妨考虑计算 \(\prod_i \left(x^{2n_i} + x^{n_i} + 1\right)\),并枚举 \(c\),提取前式的 \(cm + k + n\) 项系数。可以用数位 dp统计 每个三项式的选法,在单次 \(O(\log n)\),总 \(O(\frac{n}{m} \log n)\) 的复杂度内解决该问题。

因此作根号分治可以在 \(O(\sqrt n \log n)\) 的复杂度内解决这问题,这也在同复杂度内解决了原问题。

Submission.