正题

题目链接:https://www.luogu.com.cn/problem/P5825


题目大意

对于每个kkk,求有多少个长度为nnn的排列有kkk个位置上升。
1≤n≤2×1051\leq n\leq 2\times 10^51≤n≤2×105


解题思路

考虑到同时考虑大于和小于十分麻烦,设fif_ifi​表示钦定iii个上升时的方案

连续的上升段可以视为同一个组,那么整个序列就会被分为m=n−km=n-km=n−k段,每个组内都是无序的。

所以可以考虑一下EGF\text{EGF}EGF来做,因为不能选空段,那么每一段的生成函数就是ex−1e^x-1ex−1。

也就是fn−m=(ex−1)m[xn]f_{n-m}=(e^x-1)^m[x^n]fn−m​=(ex−1)m[xn]。二项式定理展开一下
fm=∑i=0m(mi)(−1)m−ieixf_m=\sum_{i=0}^m\binom{m}{i}(-1)^{m-i}e^{ix}fm​=i=0∑m​(im​)(−1)m−ieix
=∑i=0mm!i!(m−i)!(−1)m−iinn!=\sum_{i=0}^m\frac{m!}{i!(m-i)!}(-1)^{m-i}\frac{i^n}{n!}=i=0∑m​i!(m−i)!m!​(−1)m−in!in​
=m!n!∑i=0m(−1)m−i(m−i)!ini!=\frac{m!}{n!}\sum_{i=0}^m\frac{(-1)^{m-i}}{(m-i)!}\frac{i^n}{i!}=n!m!​i=0∑m​(m−i)!(−1)m−i​i!in​
NTT\text{NTT}NTT卷起来就好了。

然后gig_igi​表示恰好有iii个的话,上二项式反演即可
fi=∑j=0i(ij)gj⇒gi=∑j=i(−1)j−i(ji)fjf_i=\sum_{j=0}^i\binom{i}{j}g_j\Rightarrow g_i=\sum_{j=i}(-1)^{j-i}\binom{j}{i}f_jfi​=j=0∑i​(ji​)gj​⇒gi​=j=i∑​(−1)j−i(ij​)fj​
这个也是显然可以卷积快速求得的。

顺带一提的是,这个求得其实就是欧拉数⟨nk⟩\left\langle\begin{matrix} n\\k\end{matrix}\right\rangle⟨nk​⟩

联立上面的fif_ifi​和gig_igi​的式子可以得到欧拉数的通式
⟨nk⟩=∑i=0n−k(−1)n−k−iin(n+1k+j+1)\left\langle\begin{matrix} n\\k\end{matrix}\right\rangle=\sum_{i=0}^{n-k}(-1)^{n-k-i}i^n\binom{n+1}{k+j+1}⟨nk​⟩=i=0∑n−k​(−1)n−k−iin(k+j+1n+1​)

这个可以一次卷积求得

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=8e5+10,P=998244353;
ll n,m,inv[N],fac[N],f[N],g[N],r[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll op){for(ll i=0;i<m;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=m;p<<=1){ll tmp=power(3,(P-1)/p),len=(p>>1);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<m;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=f[i+len]*buf%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(m,P-2);for(ll i=0;i<m;i++)f[i]=f[i]*invn%P;}return;
}
signed main()
{scanf("%lld",&n);inv[1]=1;for(ll i=2;i<=n;i++)inv[i]=P-inv[P%i]*(P/i)%P;inv[0]=fac[0]=1;for(ll i=1;i<=n;i++)inv[i]=inv[i-1]*inv[i]%P,fac[i]=fac[i-1]*i%P;for(ll i=0;i<=n;i++)f[i]=inv[i]*power(i,n)%P,g[i]=(i&1)?(P-inv[i]):inv[i];m=1;while(m<=2*n)m<<=1;for(ll i=0;i<m;i++)r[i]=(r[i>>1]>>1)|((i&1)?(m>>1):0);NTT(f,1);NTT(g,1);for(ll i=0;i<m;i++)f[i]=f[i]*g[i]%P;NTT(f,-1);memset(g,0,sizeof(g));for(ll i=0;i<m;i++)f[i]=(i<n)?(f[i+1]*fac[i+1]%P):0;for(ll i=n;i<m;i++)f[i]=0;for(ll i=0;i<n;i++){f[i]=f[i]*fac[n-i-1];f[i]=(i&1)?(P-f[i]):f[i];g[i]=inv[i];}NTT(f,1);NTT(g,1);for(ll i=0;i<m;i++)f[i]=f[i]*g[i]%P;NTT(f,-1);for(ll i=0;i<n-i-1;i++)swap(f[i],f[n-i-1]);for(ll i=0;i<n;i++){f[i]=f[i]*inv[i]%P;f[i]=((n-i)&1)?f[i]:(P-f[i]);printf("%lld ",f[i]%P);}putchar('0');return 0;
}

P5825-排列计数【EGF,NTT】相关推荐

  1. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  2. bzoj 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 637  Solved: 396 [Submit][Stat ...

  3. 数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

    丝且人一口 Virus Tree 2 description solution code RGB Coloring description solution code 123 Triangle des ...

  4. [2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

    文章目录 T1:复读数组 题目 题解 代码实现 T2:路径计数机 题目 题解 代码实现 T3:排列计数机 题目 题解 CODE T1:复读数组 题目 有一个长为n×k的数组,它是由长为n的数组A1,A ...

  5. bzoj 4517: [Sdoi2016]排列计数(错排+组合数逆元)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1259  Solved: 766 [Submit][Sta ...

  6. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

  7. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)

    辛勤二更 题目 题解 错排数概念 错排数递推公式及其证明 代码实现 这种题做的时候: 做完后:正常这就是生活,我们要学会习惯 题目 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n ...

  8. P4071-[SDOI2016]排列计数【组合计数,错排】

    正题 题目链接:https://www.luogu.com.cn/problem/P4071 题目大意 每次询问n,mn,mn,m.求有多少个nnn的排列使得ai=ia_i=iai​=i的数量恰好为m ...

  9. bzoj2111,P2606-[ZJOI2010]排列计数【Lucas,组合计数,dp】

    正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2111 https://www.luogu.org/problem/P2606 题 ...

最新文章

  1. LeetCode简单题之数组序号转换
  2. git log 查看提交记录,参数:
  3. java基础:任意进制到十进制的转换
  4. 实验八 《Coderxiaoban团队》团队作业4:基于原型的团队项目需求调研与分析
  5. 融合的胜利——惠普连发SDS、闪存、超融合方案
  6. [COGS 622] [NOIP2011] 玛雅游戏 模拟
  7. php对象里面存对象,PHP:在$ _SESSION中存储'对象'
  8. 特异性matlab,基于灰色理论计算位置特异性矩阵
  9. dotNET Core 3.X 使用 Web API
  10. 从WEB应用的角度,一个应用都需要维护一些不同作用范围的状态, 请问下面哪些状态作用域是WEB应用特有的:( )
  11. C语言代码规范(九)运算符优先级使用括号提高阅读性
  12. MRTG在Windows平台的安装及使用
  13. 还不起9亿?有人建议为范冰冰发行一款私募ABS产品融资!
  14. (44)Verilog HDL 计数器设计
  15. python字典数据类型笔记_python笔记--数据类型--字典
  16. 判断一个二叉树是不是对称二叉树
  17. Python-函数递归-二分法
  18. nginx 安全优化
  19. Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结
  20. 通过Bottledwater同步PostgreSQL中的数据变化到Kafka消息队列

热门文章

  1. ensp查看历史配置命令_华为eNSP常用命令
  2. uiuc计算机课程,UIUC计算机科学专业解读
  3. CSDN《某一程序员竟然吃过shi?让我们走进他的生活,揭露背后的故事》
  4. java中static x 5_java中static作用详解
  5. kswapd0 挖矿_bioset linux_linux bioset 进程 腾讯云
  6. html图片宽度高度等比例绽放,css图片自动绽放大小,左右,上下居中
  7. 7-5 汽车加油问题 (20 分)(思路+详解)Come 宝!!!!!!!!!!!!!
  8. 从前中后序遍历构造二叉树,三题无脑秒杀
  9. [Java基础]List集合
  10. LeetCode 112路径总和-简单