首页 > 其他分享 >[洛谷]-5825排列计数-欧拉数、NTT

[洛谷]-5825排列计数-欧拉数、NTT

时间:2023-09-28 09:35:20浏览次数:45  
标签:洛谷 int sum NTT 5825 binom MOD fact left

目录

https://www.luogu.com.cn/problem/P5825

题意:我们记一个排列 P 的升高为 \(k\) 当且仅当存在 \(k\) 个位置 \(i\) 使得 \(P_i<P_{i+1}\)。

给定排列长度 \(n\),对于所有整数 \(k\in [0,n]\), 求有多少个排列的升高为 \(k\),\(1\leq n\leq 2\times 10^5\).


题解:就是要我们求欧拉数(Eulerian Number)\(\left<\begin{matrix}n\\k\end{matrix}\right>\)(对每个\(k\)),这里捋一捋欧拉数的性质。

边界

先看看边界:\(\left<\begin{matrix}n\\0\end{matrix}\right>=1\),即只能从小到大排,\(\left<\begin{matrix}n\\n\end{matrix}\right>=0\),这样很明显,因为\(n\)个数至多有\(n-1\)个升高。

对称性

同样不难发现类似组合数那样的对称性:\(\left<\begin{matrix}n\\k\end{matrix}\right>=\left<\begin{matrix}n\\n-k-1\end{matrix}\right>\),因为假设某个排列 \(P\) 有 \(k\) 个升高,那么就恰有 \(n-1-k\) 个下降,把排列翻转之后下降就变成了升高(升高也变成了下降)

递推形式

考虑递推形式的时候经常可以考虑增加一个元素产生的影响,假设想求\(\left<\begin{matrix}n\\k\end{matrix}\right>=?\)

考虑\(n\)移走之后是什么情况,需要说明的是增减一个元素至多改变一个“升高”,因此只要考虑 \(\left<\begin{matrix}n-1\\k\end{matrix}\right>\) 和 \(\left<\begin{matrix}n-1\\k-1\end{matrix}\right>\) ,如果原本有 \(k\) 个上升,那么 \(n\) 要么插入在上升的 \(p_i<p_{i+1}\)中间,要么插入在第一个位置之前,这一部分有 \(k+1\) 种位置可以选择。否则如果原本有\(k-1\)个上升,那么就有\((n-1)-1-(k-1)=n-k-1\)个下降,需要增加一个上升要么在下降的\(p_i>p_{i+1}\)的中间插入,要么在最后一个位置插入。综上:

\[\left<\begin{matrix}n\\k\end{matrix}\right>=(k+1)\left<\begin{matrix}n-1\\k\end{matrix}\right>+(n-k)\left<\begin{matrix}n-1\\k-1\end{matrix}\right> \]

用递推形式看起来是可以\(O(nk)\)地算某个位置的值了…但是太慢了。

在这个题里就要求我们算一行(一列似乎没什么太好的做法?——)

容斥

这一部分来自于EI的一篇博客: https://www.luogu.com.cn/blog/EntropyIncreaser/solution-p5825 ,这里大概相当于做一个更详细的注解。

欲求\(\left<\begin{matrix}n\\k\end{matrix}\right>\),先考虑转化成算概率(最后按照全概率公式,乘上方案数 \(n!\) 即可)进一步等价到\(a_1,\dots,a_n\in (0,1)\) 恰有 \(k\) 个位置\(a_i<a_{i+1}\)的概率,做差分\(b_i=a_i-a_{i-1}(\bmod 1)\),这样一来只有在\(a_i<a_{i-1}\)的地方,\(b_i=a_i-a_{i-1}+1\),否则\(b_i=a_i-a_{i-1}\),如此 \(\sum b_i=a_n+(n-1-k)\),而 \(b_i\) 的这种关系也可以证明是均匀分布(没有严格证),而\(a_n\in (0,1)\),所以\(\sum b_i\in (n-1-k,n-k)\)

问题转化成:有 \(n\) 个随机变量$x_1\dots,x_n $在 \((0,1)\) 上均匀分布,\(\sum x_i\in (n-1-k,n-k)\) 的概率。

更进一步只要考虑 \(\sum x_i<n-k\) 的概率,所以归约成如下问题:

\[\int_0^1 d x_1\dots \int _0^1 dx_n [\sum x_i<t] \]

\([0,1]\) 的限制是很麻烦,设 \(F(n,k,t)\) 表示有 \(n\) 个随机变量\(x_1\dots,x_n\in (0,+\infty)\),且强制\(k\) 个\(x_i> 1\),满足\(\sum x_i<t\) 的概率,那么根据容斥原理,答案就是

\[\sum_{k=0}^n \binom{n}{k}(-1)^{k} F(n,k,t)=\sum_{k=0}^t \binom{n}{k}(-1)^{k} F(n,0,t-k)\xlongequal{\Delta}\sum_{k=0}^t \binom{n}{k}(-1)^{k} G(n,t-k) \]

因此只要考虑:

\[\begin{aligned} G(n,t)&=\int_0^{\infty}dx_1\dots \int_0^\infty dx_n [\sum_{i=1}^n x_i < t]={\color{red}\int_0^t d x_n}\int_0^{\infty }dx_1\dots \int_0^\infty dx_{n-1} [\sum_{i=1}^{n-1} x_i<t-x_n]\\ &=\int_0^t dx_n \int_0^{\infty }(\frac{t-x_n}{t})dx_1\dots \int_0^\infty (\frac{t-x_n}{t})\ dx_{n-1} [\sum_{i=1}^{n-1} x_i<t]\\ &=F(n-1,t)\int_0^t {\color{red}(\frac{t-x_n}{t})^{n-1}} dx_n =F(n-1,t) \times \frac{t}{n}=\frac{t^n}{n!} \end{aligned} \]

因此最终答案是:

\[\begin{aligned} \left<\begin{matrix}n\\k\end{matrix}\right>&= n!\times\Big( \sum_{j=0}^{n-k} \binom{n}{j}(-1)^j G(n,n-k-j)-\sum_{j=0}^{n-k-1}\binom{n}{j}(-1)^j \ G(n,n-k-1-j)\Big)\\ &=n!\times\Big( \sum_{j=0}^{n-k} \binom{n}{j}(-1)^j G(n,n-k-j){\color{red}+}\sum_{j=1}^{n-k}\binom{n}{j-1}(-1)^{\color{red}j-1} \ G(n,n-k-j)\Big)\\ &=n!\times \sum_{j=0}^{n-k}\binom{n+1}{j}(-1)^j \frac{(n-k-j)^n}{n!}= \sum_{j=0}^{n-k}\binom{n+1}{j}(-1)^j (n-k-j)^n. \end{aligned} \]

非常标准的卷积形式,一次卷积即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int MOD=998244353;
const int N=1<<20;
int ksm(int a,int b){
	int ret=1;a%=MOD;
	for(;b;b>>=1,a=(ll)a*a%MOD)if(b&1)ret=(ll)ret*a%MOD;
	return ret;
}
int n,fact[N],inv_fact[N],f[N],g[N],r[N],w[N];
void ntt(int n,int *x,int op){
	rep(i,0,n-1)if(r[i]<i)swap(x[i],x[r[i]]);
	for(int i=1;i<n;i<<=1){
		int gn=ksm(op==1?3:332748118,(MOD-1)/(i<<1));
		w[0]=1;
		for(int k=1;k<i;k++)w[k]=(ll)w[k-1]*gn%MOD;
		for(int j=0;j<n;j+=(i<<1))
			for(int k=0;k<i;k++){
				int t1=x[j+k],t2=(ll)x[j+k+i]*w[k]%MOD;
				x[j+k]=(t1+t2)%MOD;
				x[j+k+i]=(t1-t2+MOD)%MOD;
			}
	}
	if(op==-1){
		int inv=ksm(n,MOD-2);
		rep(i,0,n-1)x[i]=(ll)x[i]*inv%MOD;
	}
}
int main(){
	fastio;
	cin>>n;
	fact[0]=1;
	rep(i,1,N-5)fact[i]=(ll)fact[i-1]*i%MOD;
	inv_fact[N-5]=ksm(fact[N-5],MOD-2);
	for(int i=N-5;i>=1;i--)inv_fact[i-1]=(ll)inv_fact[i]*i%MOD;
	rep(i,0,n){
		f[i]=(ll)fact[n+1]*inv_fact[i]%MOD*inv_fact[n+1-i]%MOD;
		if(i&1)f[i]=(MOD-f[i])%MOD;
		g[i]=ksm(i,n);
	}
	int p=1,deg=n+n;
	while(p<=deg)p<<=1;
	for(int i=0;i<p;i++)r[i]=(i&1)*(p>>1)+(r[i>>1]>>1);
	ntt(p,f,1);ntt(p,g,1);
	rep(i,0,p-1)f[i]=(ll)f[i]*g[i]%MOD;
	ntt(p,f,-1);
	rep(i,0,n)cout<<f[n-i]<<' ';
	return 0;
}

标签:洛谷,int,sum,NTT,5825,binom,MOD,fact,left
From: https://www.cnblogs.com/yoshinow2001/p/17734874.html

相关文章

  • 对期望线性性的理解以及例题:洛谷P3239
    \(E(X+Y)\)中\(X+Y\)到底什么意思?我们不妨设\(X\)对应事件1,他有一个样本空间\(\Omega_{1}\),这个样本空间中的每一个事件对应一个取值同理我们对\(Y\)也搞一个\(\Omega_{2}\)。那么\(X+Y\)指的就是\(X\)和\(Y\)的笛卡尔积两个集合的笛卡尔积指的是从这两个集合分别各取一个元素......
  • 洛谷P6583 回首过去
    涉及知识点:容斥原理、数论分块前言本题对于数论分块类型题目推式子和处理方法有很大的启发题面Link给定正整数\(n\),求有序实数对\((x,y)\)满足\(1\leqx,y\leqn\)并且使得\(\frac{x}{y}\)为有限小数(本题题意下整数可视作小数点后有\(0\)位的有限小数)。分析首先......
  • 洛谷P3612 [USACO17JAN] Secret Cow Code S
    [USACO17JAN]SecretCowCodeS题面翻译奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当......
  • 洛谷P2341 [USACO03FALL] 受欢迎的牛 G
    P2341受欢迎的牛G题解这题我们需要了解强连通分量一、定义在有向图\(G\)中,如果两个顶点\(u\),\(v\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的有向路径,则称两个顶点强连通。如果有向图\(G\)的每两个顶点都强连通,称\(G\)是一个强连通......
  • 洛谷3830
    对这题的第一问,我们可以感性地理解一下设f[i]表示i个叶子的平均叶子深度是多少那么增加一个叶子(即一次拓展操作)所有叶子的总深度增加了2,平均深度增加了\(\frac{2}{i}\)所以\(f[i]=f[i-1]+\frac{2}{i}\)然后就可以利用样例进行验证了如果不放心我们就老老实实地推式子给一些......
  • 洛谷P1058 [NOIP2008 普及组] 立体图
    写在前面题解更新较少,请勿嗔怪。本文粗鄙而简陋,要获得更好的阅读体验,请移步https://www.luogu.com.cn/problem/solution/P1058。NOIp普及组2008的第四题,题目网站https://www.luogu.com.cn/problem/P1058。关于题目[NOIP2008普及组]立体图题目描述小渊是个聪明的孩子,他经......
  • P5836 [USACO19DEC] Milk Visits S - 洛谷题解
     题目链接:[P5836] USACO19DEC] MilkVisitsS-洛谷|计算机科学教育新生态(luogu.com.cn)这道题可以用并查集来解决。题目中每个结点只有两个状态:H和G。那么我们可以推断出,只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)与所需状态不同......
  • 洛谷P5104 红包发红包
    我们假设他是离散的设[0,w]这个区间有i个数那么第一个人期望获得的钱数\(E(1)=\frac{1}{i}\sum_{j=1}^{i}\frac{w}{i}j=\frac{w(1+i)}{2i}\)因为这个区间实际上有无数个数,故令i趋于无穷,有\(E(1)=\frac{w}{2}\)那么轮到第二个人的时候还剩下\(w-\frac{w}{2}=\frac{w}{2}\)这么......
  • 洛谷 P4391. [BOI2009] Radio Transmission 无线传输
    [BOI2009]RadioTransmission无线传输题目描述给你一个字符串$s_1$,它是由某个字符串$s_2$不断自我连接形成的(保证至少重复$2$次)。但是字符串$s_2$是不确定的,现在只想知道它的最短长度是多少。输入格式第一行一个整数$L$,表示给出字符串的长度。第二行给出字符串$s_......
  • 洛谷 P3719. [AHOI2017初中组] rexp
    [AHOI2017初中组]rexp题目背景为了解决形形色色的字符串匹配问题,正则表达式是一个强有力的工具。正则表达式通过定义一套符号体系,能够表示出需要查找的字符串所具有的性质。如a|aa能匹配a或aa,(a|b)c能匹配ac或bc。题目描述完整的正则表达式过于复杂,在这里我们只考虑......