【省选模拟】Fac (生成函数)(组合意义)(拉格朗日反演)(倍增)(多项式全家桶)

本文主要是介绍【省选模拟】Fac (生成函数)(组合意义)(拉格朗日反演)(倍增)(多项式全家桶),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

  • 没有题解是真的秀,连蒙带猜搞了一天结果今天早上才写完,不过还好有 3 个神仙学长助力
    不知道题解是怎么想到的,所以只好直接说结论了

  • 经观察发现可以先求出 ( i k i − 1 ) 1 i \binom{ik}{i-1}\frac{1}{i} (i1ik)i1,这个在 k = 2 k=2 k=2 的时候是卡特兰数也就是二叉树的个数
    考虑将其扩展为 k k k 叉树,即证 f ( x ) = x f ( x ) k + 1 f(x)=xf(x)^k+1 f(x)=xf(x)k+1 ∑ ( i k i − 1 ) 1 i x i \sum \binom{ik}{i-1}\frac{1}{i}x^i (i1ik)i1xi 的生成函数

  • 证明:
    f ( x ) − 1 f ( x ) k = x , g ( x ) = x − 1 x k ⇒ [ x n ] f ( x ) = [ x n − 1 ] 1 n ( x g ( x ) ) n [ x n − 1 ] 1 n ( x g ( x ) ) n = [ x n − 1 ] 1 n ( x k + 1 x − 1 ) n \frac{f(x)-1}{f(x)^k}=x,g(x)=\frac{x-1}{x^k}\\ \Rightarrow [x^n]f(x)=[x^{n-1}]\frac{1}{n}(\frac{x}{g(x)})^n\\ [x^{n-1}]\frac{1}{n}(\frac{x}{g(x)})^n=[x^{n-1}]\frac{1}{n}(\frac{x^{k+1}}{x-1})^n f(x)kf(x)1=x,g(x)=xkx1[xn]f(x)=[xn1]n1(g(x)x)n[xn1]n1(g(x)x)n=[xn1]n1(x1xk+1)n
    中间用到了拉格朗日反演
    后面的一个是 ( x k + 1 x − 1 ) n = ∑ i ≤ k x i (\frac{x^{k+1}}{x-1})^n=\sum_{i\le k}x^i (x1xk+1)n=ikxi,所以组合意义是 x 1 + x 2 + ⋯ + x n = n − 1 , x i ≤ k x_1+x_2+\dots +x_n=n-1,x_i\le k x1+x2++xn=n1,xik,令 x = k − x x=k-x x=kx,即可得方案数为 ( k n n − 1 ) \binom{kn}{n-1} (n1kn)
    也同时证明了 n n n 个点的 k k k 叉树(有根无标号儿子有顺序)的个数是 ( n k n − 1 ) 1 n \binom{nk}{n-1}\frac{1}{n} (n1nk)n1

  • 于是问题就变成了解 x f ( x ) k − f ( x ) + 1 ≡ 0 ( m o d x n ) xf(x)^k-f(x)+1\equiv 0(mod\ x^n) xf(x)kf(x)+10(mod xn)
    这个是可以倍增的,假设已经求得 x f 0 k − f 0 + 1 ≡ 0 ( m o d x n ) xf_0^k-f_0+1\equiv 0(mod\ x^n) xf0kf0+10(mod xn)
    考虑扩展到 x f k − f + 1 ≡ 0 ( m o d x 2 n ) xf^k-f+1\equiv 0(mod\ x^{2n}) xfkf+10(mod x2n)
    我们只需要求出 [ n , 2 n ) [n,2n) [n,2n) 的系数,不妨令为 f 1 f_1 f1,我们用 f 0 + f 1 f_0+f_1 f0+f1 表示新的 f f f
    考虑前一半的贡献, x f 0 k xf_0^k xf0k [ n , 2 n ) [n,2n) [n,2n) 是有贡献的,不妨令为 A A A
    ( f 0 + f 1 ) k (f_0+f_1)^k (f0+f1)k [ n , 2 n ) [n,2n) [n,2n) 的贡献只会有一个 x x x 选到 [ n , 2 n ) [n,2n) [n,2n),故可以列出方程
    k f 1 f 0 k − 1 + A = f 1 kf_1f_0^{k-1}+A=f_1 kf1f0k1+A=f1
    解出即可,倍增算贡献还是比较巧妙
    C o d e Code Code,最慢的点跑了 1 s 1s 1s

这篇关于【省选模拟】Fac (生成函数)(组合意义)(拉格朗日反演)(倍增)(多项式全家桶)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658678

相关文章

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri