\(\mathscr{Description}\)

  Link.

  求含 \(n\) 个结点、无标号有根、结点儿子数量不超过 \(3\) 的树的数量。答案模 \(998244353\)。

  \(n\le10^5\)。

\(\mathscr{Solution}\)

  感觉 Burnside 被用在了 corner 的地方,或许就是一道 GF 上手训练叭。

  设 \([x^k]f(x)\) 表示 \(n=k\) 时问题的答案(就喜欢小写 \(f\) qwq),钦定 \([x^0]f(x)=1\)。转移即求三个可空的子树在三阶置换群下的等价类数目,Burnside 一发得到

\[f(x)=1+\frac{1}{6}x(f^3(x)+3f(x)f(x^2)+2f(x^3)).
\]

  巧妙 trick:牛迭的时候算了 \([x^{0..n-1}]f(x)\),那么 \(f(x^2)\) 和 \(f(x^3)\) 可以当做常多项式。具体地,我们想要解多项式方程 \(p(u,x)=f(x)-u=0\),那么 \(p(u,x)\) 在倍增时“等价”为

\[p(u,x)=\frac{1}{6}xu^3+\frac{1}{2}xuf(x^2)+\frac{1}{3}xf(x^3)+1-u.
\]

因而

\[u_{2n} = u_n-\frac{p(u_n,x)}{p_u(u_n,x)},
\]

其中

\[p_u(u_n,x)=\frac{1}{2}xu^2+\frac{1}{2}xf(x^2)-1.
\]

所以多项式求逆 + 牛迭即可。注意 \(\operatorname{dft}_n(x)=\lang w_n^{0..n-1}\rang\),节约一下 DFT 次数。复杂度是 \(\mathcal O(n\log n)\) 的。

  UPD: 偏导的记法貌似不对头,换成 \(p_u(u,x)\) 了。

\(\mathscr{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) const int MAXN = 1e5, MAXL = 1 << 18, MOD = 998244353;
const int INV6 = 166374059, INV2 = 499122177, INV3 = 332748118; inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline int sqr(const int u) { return mul(u, u); }
inline int cub(const int u) { return mul(u, mul(u, u)); }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += MOD); }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
} namespace PolyOper { const int MG = 3;
int omega[19][MAXL]; inline void init() {
rep (i, 1, 18) {
int* oi = omega[i]; oi[0] = 1, oi[1] = mpow(MG, MOD - 1 >> i);
rep (j, 2, (1 << i) - 1) oi[j] = mul(oi[j - 1], oi[1]);
}
} inline void ntt(const int n, int* u, const int type) {
static int rev[MAXL], lasn = -1;
if (lasn != n) {
lasn = n;
rep (i, 1, n - 1) rev[i] = rev[i >> 1] >> 1 | (i & 1) * n >> 1;
}
rep (i, 1, n - 1) if (i < rev[i]) u[i] ^= u[rev[i]] ^= u[i] ^= u[rev[i]];
for (int i = 1, stp = 1; stp < n; ++i, stp <<= 1) {
int* oi = omega[i];
for (int j = 0; j < n; j += stp << 1) {
rep (k, j, j + stp - 1) {
int x = u[k], y = mul(oi[k - j], u[k + stp]);
u[k] = add(x, y), u[k + stp] = sub(x, y);
}
}
}
if (!~type) {
std::reverse(u + 1, u + n);
int iv = MOD - (MOD - 1) / n;
rep (i, 0, n - 1) u[i] = mul(u[i], iv);
}
} inline void pinv(const int n, const int* u, int* r) {
if (n == 1) return assert(u[0]), r[0] = mpow(u[0], MOD - 2), void();
pinv(n >> 1, u, r);
static int tmp[2][MAXL];
rep (i, 0, (n >> 1) - 1) tmp[0][i] = r[i], tmp[1][i] = u[i];
rep (i, n >> 1, n - 1) tmp[0][i] = 0, tmp[1][i] = u[i];
rep (i, n, (n << 1) - 1) tmp[0][i] = tmp[1][i] = 0;
ntt(n << 1, tmp[0], 1), ntt(n << 1, tmp[1], 1);
rep (i, 0, (n << 1) - 1) {
tmp[0][i] = mul(tmp[0][i], sub(2, mul(tmp[0][i], tmp[1][i])));
}
ntt(n << 1, tmp[0], -1);
rep (i, 0, n - 1) r[i] = tmp[0][i];
} inline void _test_() {
#ifdef RYBY
int tmp[] = { 1, 6, 3, 4, 9, 0, 0, 0 }, res[8];
pinv(8, tmp, res);
rep (i, 0, 7) printf("%d%c", res[i], i < 7 ? ' ' : '\n');
#endif
} } using namespace PolyOper; int n, f[MAXL], g[MAXL], dg[MAXL], rg[MAXL], sf[MAXL], cf[MAXL]; inline void solve(const int len) {
if (len == 1) return void(f[0] = 1);
solve(len >> 1); rep (i, 0, len - 1) g[i] = dg[i] = sf[i] = cf[i] = 0;
rep (i, 0, (len - 1) / 2) sf[i << 1] = f[i];
rep (i, 0, (len - 1) / 3) cf[i * 3] = f[i];
ntt(len << 1, f, 1), ntt(len << 1, sf, 1), ntt(len << 1, cf, 1); int wn = 32 - __builtin_clz(len);
rep (i, 0, (len << 1) - 1) {
int wi = omega[wn][i];
g[i] = sub(mul(wi, add(mul(INV6, cub(f[i])),
add(mul(INV2, mul(f[i], sf[i])), mul(INV3, cf[i])))), sub(f[i], 1));
dg[i] = sub(mul(mul(INV2, wi), add(sqr(f[i]), sf[i])), 1);
}
ntt(len << 1, g, -1), ntt(len << 1, dg, -1);
rep (i, len, (len << 1) - 1) g[i] = dg[i] = 0; pinv(len, dg, rg);
ntt(len << 1, g, 1), ntt(len << 1, rg, 1);
rep (i, 0, (len << 1) - 1) subeq(f[i], mul(g[i], rg[i]));
ntt(len << 1, f, -1);
rep (i, len, (len << 1) - 1) f[i] = 0;
} int main() {
scanf("%d", &n), init();
// _test_();
solve(1 << 32 - __builtin_clz(n));
printf("%d\n", f[n]);
return 0;
}

Solution -「LOJ #6538」烷基计数 加强版 加强版的更多相关文章

  1. Solution -「LOJ #6029」「雅礼集训 2017」市场

    \(\mathcal{Description}\)   Link.   维护序列 \(\lang a_n\rang\),支持 \(q\) 次如下操作: 区间加法: 区间下取整除法: 区间求最小值: 区 ...

  2. Solution -「LOJ #138」「模板」类欧几里得算法

    \(\mathcal{Description}\)   Link.   \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求 \[\sum_{x=0}^nx^{k_1}\left\ ...

  3. Solution -「LOJ #141」回文子串 ||「模板」双向 PAM

    \(\mathcal{Description}\)   Link.   给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\ ...

  4. Solution -「LOJ #150」挑战多项式 ||「模板」多项式全家桶

    \(\mathcal{Description}\)   Link.   给定 \(n\) 次多项式 \(F(x)\),在模 \(998244353\) 意义下求 \[G(x)\equiv\left\{ ...

  5. Solution -「LOJ #6053」简单的函数

    \(\mathcal{Description}\)   Link.   积性函数 \(f\) 满足 \(f(p^c)=p\oplus c~(p\in\mathbb P,c\in\mathbb N_+) ...

  6. Solution -「LOJ #6485」 LJJ 学二项式定理

    \(\mathcal{Description}\)   Link.   给定 \(n,s,a_0,a_1,a_2,a_3\),求: \[\sum_{i=0}^n\binom{n}is^ia_{i\bm ...

  7. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  8. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie

    #10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...

  9. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  10. Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等.   \(n\le1 ...

随机推荐

  1. 关于linux 终端的小命令

    Ubuntu 为例 ctrl alt t   新开一个终端(默认工作目录) ctrl shift t 在当前终端开一个tab (工作目录和当前tab一致 当你进入一个很深的目录的时候需要新开一个命令行 ...

  2. php之编译安装

    1. 安装所需环境 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng ...

  3. 开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)

    书接上回,前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能,今天实现进入其第二步的核心功能ExcelHelper实现. 01.接口设计 下面我们根 ...

  4. jQuery 元素信息

    先贴出元素模型信息 1.获取内容区大小 css():返回值是带单位的(getComputedStyle(node).width) <script> $(function(){ consol ...

  5. zustand:基于hooks的react状态管理

    react的状态管理 状态(State)是 React 中用于存储组件数据的特殊对象,它可以影响组件的渲染输出.状态管理的核心目标是确保数据的一致性.可预测性以及组件之间的数据流. 每个 React ...

  6. Python OpenCV按照像素点图片切割

    图像分割是从图像处理到图像分析的关键步骤,在目标检测.特征提取.图像识别等领域具有广泛应用.OpenCV是一个强大的计算机视觉库,提供了多种图像分割方法.本文将详细介绍如何使用Python和OpenC ...

  7. 鸿蒙UI布局实战 —— 个人中心页面开发

    1.前言 接下里我们将开启"鸿蒙UI布局系列"的学习,第一站:学习线性布局(Row/Column)+ 弹性布局(Flex) 在展开学习前,先上一个实战demo--开发一个个人中心页 ...

  8. 【滑动窗口】codeforces 1290 A. Mind Control

    题意 第一行输入一个正整数 \(T(1 \leq T \leq 1000)\),表示共有 \(T\) 组测试用例.对于每一组测试用例: 第一行输入三个正整数 \(n, m, k(1 \leq m \l ...

  9. 裸辞一年狂肝了一个AI搜索!我要硬刚Google和Perplexity!

    Hika AI 是一款 AI 加持的「知识搜索工具」,它主要的目的是帮助你在搜索问题时通过Hika的「不同视角的思路」,为你快速延伸问题相关的知识领域,或者深挖问题中某个关键点,获得更加全面的结果. ...

  10. 【Java】【Maven】002 修改maven仓库的路径与配置阿里云镜像仓库

    [Java][Maven]001 下载与配置环境 - 萌狼蓝天 - 博客园 (cnblogs.com/mllt) 修改maven仓库的路径 maven指定的本地仓库的默认位置是在c盘,默认在:C:\U ...