$ \color{#0066ff}{ 题目描述 }$

hsezoi 巨佬 olinr 喜欢 van 毛毛虫,他定义毛毛虫是一棵树,满足树上存在一条树链,使得树上所有点到这条树链的距离最多为 1。 给定 n 。现在请你求出 n 个点、有标号的毛毛虫的数量。答案对 998244353 取模。

\(\color{#0066ff}{输入格式}\)

输入只有一行一个整数 n 。

\(\color{#0066ff}{输出格式}\)

输出一行,表示答案。

\(\color{#0066ff}{输入样例}\)

5

\(\color{#0066ff}{输出样例}\)

125

\(\color{#0066ff}{数据范围与提示}\)

对于 40% 的数据,对于第 \(i\) 个测试点有 \(n=i+4\)。
对于 100% 的数据,\(n\le 10^5\) 。

\(\color{#0066ff}{题解}\)

首先说一句,我很弱

对于一个毛毛虫,我们考虑毛毛虫的一个节,就是那条链上的一个点,可以有一些点接在它身上,假如说有k个点, 那么方案数就是k,(k个点中的一个作为毛毛虫的一节,剩下的k-1个挂在那个点上)

于是它的生成函数\(\begin{aligned}A(x)=\sum_{i\ge 1}i*\frac{x^i}{i!}=\sum_{i\ge 1}\frac{x^i}{(i-1)!}\end{aligned}\)(可以只有自己,没有点挂上去)

还有两个特殊点,就是这条链的两端,我们强制它至少挂上一个点,就是\(\begin{aligned}B(x)=\sum_{i\ge 2}\frac{x^i}{(i-1)!}\end{aligned}\)

然而你发现,少了菊花的情况,但是菊花的情况好统计,就是n

因此答案就是\(B(x)*\frac{1}{1-A(x)}*B(x)\)的第n项乘上n的阶乘除以2(正反算一个)再加上n

\(n\le 2\)要特判,然而并没有这样的数据

#include<bits/stdc++.h>
#define LL long long
LL in() {char ch; LL x = 0, f = 1;while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));return x * f;
}
using std::vector;
const int mod = 998244353;
const int maxn = 4e6 + 10;
int r[maxn], len;
LL ksm(LL x, LL y) {LL re = 1LL;while(y) {if(y & 1) re = re * x % mod;x = x * x % mod;y >>= 1;}return re;
}
void FNTT(vector<int> &A, int flag) {A.resize(len);for(int i = 0; i < len; i++) if(i < r[i]) std::swap(A[i], A[r[i]]);for(int l = 1; l < len; l <<= 1) {int w0 = ksm(3, (mod - 1) / (l << 1));for(int i = 0; i < len; i += (l << 1)) {int w = 1, a0 = i, a1 = i + l;for(int k = 0; k < l; k++, a0++, a1++, w = 1LL * w * w0 % mod) {int tmp = 1LL * A[a1] * w % mod;A[a1] = ((A[a0] - tmp) % mod + mod) % mod;A[a0] = (A[a0] + tmp) % mod;}}}if(flag == -1) {std::reverse(A.begin() + 1, A.end());int inv = ksm(len, mod - 2);for(int i = 0; i < len; i++) A[i] = 1LL * A[i] * inv % mod;}
}
vector<int> operator * (const vector<int> &A, const vector<int> &B) {int tot = A.size() + B.size() - 1;vector<int> C = A, D = B;for(len = 1; len <= tot; len <<= 1);for(int i = 0; i < len; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) * (len >> 1));FNTT(C, 1), FNTT(D, 1);vector<int> ans;ans.resize(len);for(int i = 0; i < len; i++) ans[i] = 1LL * C[i] * D[i] % mod;FNTT(ans, -1);ans.resize(tot);return ans;
}
vector<int> operator - (const vector<int> &A, const vector<int> &B) {vector<int> ans;for(int i = 0; i < (int)std::min(A.size(), B.size()); i++) ans.push_back(A[i] - B[i]);if(A.size() < B.size()) for(int i = A.size(); i < (int)B.size(); i++) ans.push_back(-B[i]);if(A.size() > B.size()) for(int i = B.size(); i < (int)A.size(); i++) ans.push_back(A[i]);return ans;
}
vector<int> inv(const vector<int> &A) {if(A.size() == 1) {vector<int> ans;ans.push_back(ksm(A[0], mod - 2));return ans;}int n = A.size(), _ = (n + 1) >> 1;vector<int> ans, B = A;ans.push_back(2);B.resize(_);B = inv(B);ans = B * (ans - A * B);ans.resize(n);return ans;
}
int fac[maxn];
int main() {int n = in();fac[0] = 1;for(int i = 1; i <= n; i++) fac[i] = 1LL * fac[i - 1] * i % mod;std::vector<int> a, b;a.resize(n + 1, 0), b.resize(n + 1, 0);for(int i = 1; i <= n; i++) a[i] = mod - ksm(fac[i - 1], mod - 2);for(int i = 2; i <= n; i++) b[i] = ksm(fac[i - 1], mod - 2);a[0]++;a = inv(a);a = b * a * b;printf("%lld\n", (1LL * a[n] * fac[n] % mod * ksm(2, mod - 2) % mod + n) % mod);return 0;
}

转载于:https://www.cnblogs.com/olinr/p/10601535.html

loj #6570. 毛毛虫计数相关推荐

  1. 【LOJ6570】毛毛虫计数

    [题目链接] 点击打开链接 [思路要点] 定义毛毛虫的主链为去掉度为 1 1 1 的节点的部分. 主链长度不足 2 2 2 的情况即为一个菊花图,显然有 N − [ N = 2 ] N-[N=2] N ...

  2. LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)

    题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填 ...

  3. LOJ #6358 前夕 (组合计数、容斥原理)

    题目链接 https://loj.ac/problem/6358 题意 题面写得就像一坨X一样,我来复述一下吧. 有\(n\)个元素构成的集合,要从\(2^n\)个子集中选出若干个使得交的大小为\(4 ...

  4. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  5. [学习笔记]多项式与有标号简单图计数

    学了一天的有标号无向图计数真的自闭了- 本篇文章是基于2019WC汪乐平大佬的讲课课件<生成函数,多项式算法与图的计数>编写的. 注意:文中所有生成函数都规定为指数型生成函数(EGF),请 ...

  6. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  7. LOJ刷题记录:2000-2005(SDOI2017)

    LOJ刷题记录:2000-2005(SDOI2017) 立一个flag-loj不跳题刷题233 loj2000. 「SDOI2017」数字表格 求: ∏1≤i≤n∏1≤j≤mf(gcd(i,j)) \ ...

  8. [LOJ#2983][WC2019]数树

    Address 洛谷 P5206 LOJ #2983 Solution 这是一道计数 (shen) 好 (xian) 题,综合性很强 ,虽然是三合一 鉴于此题用到的算法较多,我就不在标题里列出了,此题 ...

  9. LOJ#6074. 「2017 山东一轮集训 Day6」子序列

    LOJ#6074. 「2017 山东一轮集训 Day6」子序列 先考虑全局询问怎么做,设 f ( i , c ) f(i,c) f(i,c) 表示在 S 1 ⋯ i S_{1\cdots i} S1⋯ ...

最新文章

  1. 刚刚,arXiv论文数破200万!没有arXiv,就没有21世纪的科研突破
  2. 开源桌面系统及设计图、下载地址
  3. Axis,axis2,Xfire以及cxf对比 (转)
  4. 卷积神经网络CNN 手写数字识别
  5. Water Balance CodeForces - 1300E
  6. CentOS 7 Flannel的安装与配置
  7. Java跳出多重循环
  8. Django框架 day03
  9. 2021-07-05 页面的生命周期
  10. Wireshark实战分析之IP协议(一)
  11. java框架面试题及答案,年薪50W
  12. win7万能声卡驱动_黑苹果AppleALC声卡驱动教程详解
  13. Filenet公布第二批打包节点竞选名单
  14. 【学习笔记】生物数据库の初步了解
  15. 容器用干燥剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 麒麟操作系统V10登录微信报错
  17. vmware(鼠标移出移入)反复触发numlock问题
  18. 浅谈LED芯片库存信息化管理
  19. 蓝桥杯2020第二场JAVA C真题
  20. 微信小程序-编辑器插件

热门文章

  1. 在Word加载EndNote插件
  2. 京东 按时上下班被开除,国内IT业惨状
  3. WhatsApp群控的好处,为什么使用SendWS拓客系统实现WhatsApp耐用账号的群控管理?
  4. linux 显卡 压力测试软件,显卡压力测试工具 GpuTest
  5. 配置mysql数据库端口号_数据库配置时要注意端口号
  6. D0g3 CTF-WEB
  7. 使用Vue实现todos(Vue CLI和VueX)
  8. censo7安装mysql_centso7.2上mysql安装
  9. Python中布尔索引的使用
  10. python 实现图片添加文字水印