EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P5860 「SWTR-3」Counting Trees

题目背景

一个风和日丽的早晨,小 S 带着他的好朋友小 A 在小树林里面数树。

看着满树林的树,小 S 灵感一闪,想到了一道题目。

Suddenly, Little S thought of a supercalifragilisticexpialidocious problem.He wanted Little A to answer it.

题目描述

现在有 n 个点,每个点有一个权值 vi

S 想要小 A 从中选一些点组成一个集合,设集合 S={d1,d2,,dm}(1mn)

当然,小 A 还需要保证这些点能形成一颗树,且 di 的度数为 vdi(i[1,m])。(节点的度数:与它相邻的节点的个数)

S 想问小 A 有多少种满足条件的方案。

A 深知自己肯定不会这道题目,所以他就拿来问你了。

由于方案数可能很大,所以请对 998244353 取模。

输入格式

第一行,一个整数 n

第二行,n 个整数 v1,v2,,vn

输出格式

一行一个整数,表示方案数。

输入输出样例 #1

输入 #1

1
2
3
1 1 1

输出 #1

1
3

输入输出样例 #2

输入 #2

1
2
5
1 2 1 3 1

输出 #2

1
8

输入输出样例 #3

输入 #3

1
2
8
1 2 1 2 4 1 3 1

输出 #3

1
44

输入输出样例 #4

输入 #4

1
2
50
8 1 10 2 2 1 2 1 1 2 5 1 11 6 13 13 10 4 1 13 11 2 2 11 13 10 1 1 4 3 4 2 15 2 2 1 1 2 1 7 14 2 2 4 13 2 7 5 6 10

输出 #4

1
176873472

说明/提示

样例说明

  • 对于样例 1,在三个节点中任选两个即可,答案为 C32=3

  • 对于样例 2,如图,共有 8 种选择节点的方法。

数据范围与约定

本题使用捆绑测试。

Subtask 编号 n 特殊性质 得分
1 20 11
2 50 12
3 300 10
4 2500 17
5 4×104 6
6 3×105 vi3 8
7 3×105 数据随机 7
8 5×105 29

对于 100% 的数据,2n5×105 1vin

Subtask 7 中“数据随机”指:对于所有 vi13 的概率为 1,23 的概率为 [2,n] 中等概率选择一个数。

对于前 4Subtask,时间限制 1s

对于第 5Subtask,时间限制 3s

对于后 3Subtask,时间限制 6s

对于所有测试点,空间限制 256MB

题解

一个集合 {d1,d2,,dm} 能组成树的充要条件是 i=1mvdi=2m2,变形得到 i=1m(vdi2)=2。则问题转化为求 vdi2 之和为 2 的子集数。

构造生成函数

F(x)=i=1n(1+xvi2)

则答案为 [x2]F(x),即 F(x)x2 项的系数。

  • 对于负整数次幂,考虑到 vi2<0 当且仅当 vi=1kvi2=1 其总贡献为 (1+x1)k=i=0kCkixi

  • 对于 0 次幂,显然其贡献为 2 的幂;

  • 对于正整数次幂,构造多项式

G(x)=i=1n(1+xvi2)[vi>2]=exp(i=1nln(1+xai)[vi>2])

其中 ln(1+xp)=i=1+(1)i1xpii

总时间复杂度为 O(nlogn)