正题

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


题目大意

求有多少个长度为nnn的排列,使得有AAA个前缀最大值和BBB个后缀最大值。

0≤n,A,B≤1050\leq n,A,B\leq 10^50≤n,A,B≤105


解题思路

显然的是把最大的数两边然后左边的是前缀最大值,右边的是前缀最小值。

然后考虑两个前缀最大值之间其实可以插任何数字,但是最大的一定要排在前面。

其实就是这些数字分成若干个圆排列的个数,就是第一类斯特林数。

枚举左右两边的数量就有
∑i=0n−1[ia−1][n−i−1b−1](n−1i)\sum_{i=0}^{n-1}\begin{bmatrix}i\\a-1\end{bmatrix}\begin{bmatrix}n-i-1\\b-1\end{bmatrix}\binom{n-1}{i}i=0∑n−1​[ia−1​][n−i−1b−1​](in−1​)
然后组合意义理解一下,我们可以考虑直接分成a+b−2a+b-2a+b−2个环然后再依次排列到左右就是
[n−1a+b−2](a+b−2a−1)\begin{bmatrix}n-1\\a+b-2\end{bmatrix}\binom{a+b-2}{a-1}[n−1a+b−2​](a−1a+b−2​)

这个看起来就好做很多,先考虑怎么求第一类斯特林数。

考虑递推式
[nm]=[n−1m−1]+[n−1m]×(n−1)\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+\begin{bmatrix}n-1\\m\end{bmatrix}\times(n-1)[nm​]=[n−1m−1​]+[n−1m​]×(n−1)
可以理解为0∼n−10\sim n-10∼n−1个里面选出mmm个数的乘积之和。

用生成函数做就是
∏i=0n−1(x+i)\prod_{i=0}^{n-1}(x+i)i=0∏n−1​(x+i)

用分治+NTTNTTNTT算就好了,当然推式子还有更快的方法

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10,P=998244353;
struct Poly{ll f[N];ll n;
}F[20];
ll n,a,b,f[N],g[N],r[N];bool use[20];
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 n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;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<n;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(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return;
}
void mul(Poly &x,Poly &y){ll n=1;while(n<x.n+y.n)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);for(ll i=0;i<n;i++)f[i]=x.f[i],g[i]=y.f[i];NTT(f,n,1);NTT(g,n,1);for(ll i=0;i<n;i++)f[i]=f[i]*g[i]%P;NTT(f,n,-1);for(ll i=0;i<n;i++)x.f[i]=f[i],y.f[i]=0;x.n=x.n+y.n-1;return;
}
ll FindE(){for(ll i=0;i<20;i++)if(!use[i])return i;
}
ll solve(ll l,ll r){if(l==r){ll p=FindE();F[p].f[0]=l;F[p].f[1]=1;F[p].n=2;use[p]=1;return p;}ll mid=(l+r)>>1;ll ls=solve(l,mid),rs=solve(mid+1,r);mul(F[ls],F[rs]);use[rs]=0;return ls;
}
ll C(ll n,ll m){ll ans=1,fac=1;for(ll i=m+1;i<=n;i++)ans=ans*i%P;for(ll i=1;i<=n-m;i++)fac=fac*i%P;return ans*power(fac,P-2)%P;
}
signed main()
{scanf("%lld%lld%lld",&n,&a,&b);if(!a||!b||a+b-2>n-1)return puts("0")&0;if(n==1)return puts("1")&0;ll p=solve(0,n-2);printf("%lld\n",F[p].f[a+b-2]*C(a+b-2,a-1)%P);return 0;
}

CF960G-Bandit Blues【第一类斯特林数,分治,NTT】相关推荐

  1. 【2019雅礼集训】【CF 960G】【第一类斯特林数】【NTT多项式】permutation

    目录 题意 输入格式 输出格式 思路 代码 题意 找有多少个长度为n的排列,使得从左往右数,有a个元素比之前的所有数字都大,从右往左数,有b个元素比之后的所有数字都大. n<=2*10^5,a, ...

  2. 第一类斯特林数 / 第二类斯特林数 / 贝尔数 小结

    第一类斯特林数 有 nnn 个不同的小球,将它们串成 mmm 条项链,有多少种不同的方案? 第一类斯特林数的表示方法为 [nm]\left[\begin{matrix}n\\m\end{matrix} ...

  3. 第一类斯特林数学习记录

    最近做题有时会碰到斯特林数(Stirling数),就觉得好好的学习一番,于是呢,写下这篇博客,来记录一些知识 简单介绍 第一类斯特林数表示表示将 n 个不同元素构成m个圆排列的数目.--百度百科 第一 ...

  4. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】

    题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...

  5. 建筑师 第一类斯特林数

    文章目录 目录 题意: 思路: 目录 题意: 给你一个nnn的排列,排列中的数代表他的高度,问你有多少个排列能使得从左边能看到aaa个建筑,从右边能看到bbb个建筑. 如果建筑iii左边没有任何比他高 ...

  6. [HDU 3625] Examining the Rooms(第一类斯特林数)

    Examining the Rooms problem solution code problem hdu 3625 solution 之前考试有一道题:最多砸开 kkk 扇门,采取最有操作,求把 n ...

  7. [数学最安逸][UVa1638改编][第一类斯特林数+组合数]杆子的排列

    有高为1,2,3,...,n的杆子各一根排成一行.从左边能看到l根,从右边能看到r根,求有多少种可能. (l,r <= 200,n <= 200000) 给出T 组数据 (T <= ...

  8. 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)

    传送门 题解: 完全自己推出来的第一道数学神题. 首先我们知道宽度为222的部分方案数是斐波那契数列. 设fnf_nfn​表示长度为nnn的时候方案数,题目要求的实际上是这个东西: ∑n=lr(fnk ...

  9. zoj3344 第一类斯特林数+java大数

    题意:有个游戏,两个人玩.有n个卡片,洗牌后放入编号为1到n的盒子里,然后两个人轮流做如下操作,拿出盒子中编号最小的卡片k,然后再去编号为k的盒子中拿出卡片,依次类推,直到没有卡片可拿为止.拿走最后一 ...

最新文章

  1. 谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...
  2. linux shell 符号 变量 参数表示
  3. excel多元线性拟合_Python一元线性回归分析实例:价格与需求的相关性
  4. 互联网人,天生就是送外卖的料!
  5. if else可以看成一个完整的代码块
  6. qt窗口关闭退出程序_Qt5 窗口关闭信号的响应~
  7. EBS请求查找运行详细信息
  8. Android官方开发文档Training系列课程中文版:分享文件之分享一个文件
  9. React之类式组件中的构造器与props
  10. Centos 6.4部署DNS服务器
  11. 标准的的Flash插入
  12. SAP License:生产订单无目标成本解决办法
  13. ASP.NET Core 3.0 实战:构建多版本 API 接口
  14. 50 岁的他笑谈码农真相,看完清醒了!| 人物志
  15. shell for循环命令行_24 道 shell 脚本面试题
  16. 七月算法机器学习 6 特征工程 小案例
  17. Clone使用方法详解【转载】
  18. 企业安全建设-蜜标(honeytokens)
  19. HTML5小游戏--数字炸弹
  20. CPM、CPC、CPA、PFP、CPS、CPL、CPR等广告术语是什么意思

热门文章

  1. influxdb mysql对比_InfluxDB和MySQL的读写对比测试
  2. python中线程和进程_python中线程和进程的简单了解
  3. python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?
  4. php7 匿名继承类_PHP7中的匿名类使用方法_后端开发
  5. 项目进度计划甘特图_项目管理进度计划表制作及甘特图绘制方法
  6. java 计时_Breitling(百年灵)世界时间终极计时腕表
  7. 7-24 树种统计 (25 分)(详解)map做法 map真香啊!
  8. [蓝桥杯2016初赛]密码脱落
  9. Ticket Game CodeForces - 1215D(博弈题,巴什博弈思维)
  10. SpringCloud Alibaba 框架下公司架构图