【bzoj3625】小朋友与二叉树

题意

我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树。

考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合{c[1],c[2],...,c[n]}中,我们的小朋友就会将其称作神犇的。并且他认为,一棵带点权的树的权值,是其所有顶点权值的总和。

给出一个整数m,你能对于任意的s(1<=s<=m)计算出权值为s的神犇二叉树的个数吗?请参照样例以更好的理解什么样的两棵二叉树会被视为不同的。

我们只需要知道答案关于998244353(7172^23+1,一个质数)取模后的值。

\(1\leq n,m\leq 10^5\)

\(1\leq c[i]\leq 10^5\)

分析

真的是一道毒瘤题...

虽然很有意思。

我们对于数列\(c[1],c[2],...,c[n]\),设\(vis[i]=\sum_{j=1^n}[i=c[j]]\),即\(vis[i]\)表示\(c[j]=i\)的个数。

记\(vis[0],vis[1],vis[2],...,vis[n]\)生成函数为\(C=\sum_{i=0}^{infty}vis[i]x^i\)

设\(f[s]\)表示权值为\(s\)的神犇二叉树的个数。

则根据题意,我们要求\(f[0],f[1],...,f[n],...\)。

①奠基:当\(s=0\)时,\(f[s]=1\)

②转移:当\(s>0\)时,

\(f[s]=\sum_{i,j}c[i]*f[j]*f[s-i-j]\)

记\(f[0],f[1],...,f[n]\)的生成函数为\(F=\sum_{i=0}^{\infty}\)

我们只需要求出\(F\)即可。

把\(f\)的转移等式代入\(F\),则有

\(F=C*F*F+1\)

\(\therefore CF^2-F+1=0\)

根据求根公式,有\(F={1\pm \sqrt{1-4C}\over 2C}\)

对于下面的\(2C\),我们打算对\(F={1\pm \sqrt{1-4C}\over 2C}\)两边同时关于\(x^n\)取模,且只要等式两边小于\(x^n\),就可以直接等价。

这样的\(n\)是很容易找到的,使得:\(F={1\pm \sqrt{1-4C}\over 2C}\Leftrightarrow F\equiv {1\pm \sqrt{1-4C}\over 2C}(\mod x^n)\)

然后求\(2C\)的逆元即可把分母去掉。

首先要满足\(2C\)有逆元,而多项式有逆元的充要条件就是它的常数项有逆元。

而C的常数项为0,所以没有逆元。

所以分母的常数项必须也为零,才能把一个x消掉得到常数项。

因为$ \sqrt{1+4C}$的常数项为1,之前用1加上,所以必须为-号。

所以转化为:\(F\equiv {1-\sqrt{1-4C}\over 2C}\)

等式右边的分子分母同时乘上\(1+\sqrt{1-4C}\),得到:

\(F\equiv {4C\over 2C(1+\sqrt {1-4C})}={2\over 1+\sqrt{1+4C}}\)

现在需要解决两个问题即可:①多项式求逆 ②多项式开根

【多项式求逆】

一篇很好的讲解:http://blog.miskcoo.com/2015/05/polynomial-inverse

问题描述:已知\(A(x)\),求\(B(x)\),使得设\(A(x)B(x)\equiv 1(\mod x^n)\)

解决方案:

①当\(n=1\)时,设\(A(x)=c\),那么只有求出\(B(x)=inv(c)(\mod x^n)\)即可。

②当\(n>1\)时,设\(A(x)B'(x)\equiv 1(\mod x^{\lceil{n\over 2}\rceil})\),现在要求\(B(x)\)。

\(\because A(x)B(x)\equiv 1(\mod x^n)\)

\(\therefore A(x)B(x)\equiv 1(\mod x^{\lceil{n\over 2}\rceil})\)

\(\therefore B(x)-B'(x)\equiv 0(\mod x^{\lceil{n\over 2}\rceil})\)

\(\therefore B^2(x)-2BB'(x)+B'^2(x)\equiv 0(\mod x^n)\)

两边同时乘上\(A(x)\),\(\therefore B(x)-2B'(x)+AB'(x)\equiv 0(\mod x^n)\)

\(\therefore B(x)=2B'(x)-AB'^2(X)\)

复杂度分析:\(T(n)=T(n/2)+O(n\log n)=O(n\log n)\)

【多项式开根】

一篇很好的讲解:http://blog.csdn.net/wzq_qwq/article/details/48394749

问题描述:已知\(A(x)\),求\(H(x)\),使得\(H^2(x)\equiv A(x)(\mod x^n)\)

解决方案:

①当\(n=1\)时,直接求逆元

②当\(n>1\)时,设\(G(x)\),使得\(G^2(x)\equiv A(x)(\mod x^{\lceil{n\over 2}\rceil})\)

\(\therefore G^2(x)-A(x)\equiv 0(\mod x^{\lceil{n\over 2}\rceil})\)

\(\therefore (G^2(x)-A(x))^2\equiv 0(\mod x^n)\)

\(\therefore (G^2(x)+A(x))^2\equiv 4G^2(x)A(x)(\mod x^n)\)

\(\therefore ({G^2(x)+A(x)\over 2G(x)})^2=A(x)(\mod x^n)\)

\(\therefore H(x)\equiv {G(x)\over 2}+{A(x)\over 2G(x)}(\mod x^n)\)

【bzoj3625】【xsy1729】小朋友和二叉树的更多相关文章

  1. [BZOJ3625][CF438E]小朋友和二叉树

    题面 Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots,c_n\).如果一棵带点权的有根二叉树满足其 ...

  2. [BZOJ3625][CF438E]小朋友和二叉树 (多项式开根,求逆)

    题面 题解 设多项式的第a项为权值和为a的二叉树个数,多项式的第a项表示是否为真,即 则,所以F是三个多项式的卷积,其中包括自己: ,1是F的常数项,即. 我们发现这是一个一元二次方程,可以求出,因为 ...

  3. BZOJ3625 CF438E 小朋友与二叉树

    心态崩了 不放传送门了 辣鸡bz 还是正经一点写一下题解= = 就是显然我们可以把权值写成生成函数形式g(0/1序列)来表示权值是否出现 然后f来表示总的方案数 可以列出 分别枚举左右子树和空树的情况 ...

  4. 【BZOJ3625/CF438E】小朋友和二叉树(多项式求逆,多项式开方)

    [BZOJ3625/CF438E]小朋友和二叉树(多项式求逆,多项式开方) 题面 BZOJ CodeForces 大致题意: 对于每个数出现的次数对应的多项式\(A(x)\) 求\[f(x)=\fra ...

  5. BZOJ 3625: [Codeforces Round #250]小朋友和二叉树

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 13 ...

  6. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  7. 【CF438E】小朋友和二叉树 解题报告

    [CF438E]小朋友和二叉树 Description ​ 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. ​ 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\dots,c_n\). ...

  8. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  9. 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆

    题目大意 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots ,c_n\).如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合\(\{c_1,c_2,\ldots ,c_n\ ...

随机推荐

  1. RS485模块(485与TTL信号的转换)

    1 综述 MAX3483, MAX3485, MAX3486, MAX3488, MAX3490以及MAX3491是用于RS-485与RS-422通信的3.3V,低功耗收发器,每个器件中都具有一个驱动 ...

  2. SqlSever基础 substring 从指定位置开始,截取指定长度的字符串

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  3. SqlSever基础 rtrim函数 除去字符串的右边的空格,左边中间的不管

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  4. oracle 触发器实现主键自增

    drop table book; --创建表 create table book( bookId varchar2() primary key, name varchar2() ); --创建序列 c ...

  5. Set Font Properties On Mouse Hover Of Push Button And Text Items At Run time In Oracle Forms

    Change the font size and weight of text items and push buttons on mouse hover in Oracle Forms.   An ...

  6. shell 标出输入、标准输出、错误输出

    shell中可能经常能看到:>/dev/null  2>&1  eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  7. JSONObject.fromObject

    JSONObject.fromObjectjava.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRun ...

  8. hihoCoder太阁最新面经算法竞赛17

    比赛链接:http://hihocoder.com/contest/hihointerview26 A.排序后枚举两个点,确定一个矩形后二分剩下两个点. #include <bits/stdc+ ...

  9. Linux链接库一(动态库,静态库,库放在什么路径下)

    http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...

  10. shell script数组使用函数输出

    #!/bin/bash # array variable to function test function testit { local newarray newarray=("$@&qu ...