CF960G-Bandit Blues【第一类斯特林数,分治,NTT】
正题
题目链接:https://www.luogu.com.cn/problem/CF960G
题目大意
求有多少个长度为\(n\)的排列,使得有\(A\)个前缀最大值和\(B\)个后缀最大值。
\(0\leq n,A,B\leq 10^5\)
解题思路
显然的是把最大的数两边然后左边的是前缀最大值,右边的是前缀最小值。
然后考虑两个前缀最大值之间其实可以插任何数字,但是最大的一定要排在前面。
其实就是这些数字分成若干个圆排列的个数,就是第一类斯特林数。
枚举左右两边的数量就有
\]
然后组合意义理解一下,我们可以考虑直接分成\(a+b-2\)个环然后再依次排列到左右就是
\]
这个看起来就好做很多,先考虑怎么求第一类斯特林数。
考虑递推式
\]
可以理解为\(0\sim n-1\)个里面选出\(m\)个数的乘积之和。
用生成函数做就是
\]
用分治+\(NTT\)算就好了,当然推式子还有更快的方法
时间复杂度\(O(n\log^2 n)\)
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】的更多相关文章
- CF960G Bandit Blues 第一类斯特林数、NTT、分治/倍增
传送门 弱化版:FJOI2016 建筑师 由上面一题得到我们需要求的是\(\begin{bmatrix} N - 1 \\ A + B - 2 \end{bmatrix} \times \binom ...
- [CF960G]Bandit Blues(第一类斯特林数+分治卷积)
Solution: 先考虑前缀,设 \(f(i, j)\) 为长度为 \(i\) 的排列中满足前缀最大值为自己的数有 \(j\) 个的排列数. 假设新加一个数 \(i+1\) 那么会有: \[ f ...
- CF960G Bandit Blues 第一类斯特林数+分治+FFT
题目传送门 https://codeforces.com/contest/960/problem/G 题解 首先整个排列的最大值一定是 \(A\) 个前缀最大值的最后一个,也是 \(B\) 个后缀最大 ...
- CF960G Bandit Blues 【第一类斯特林数 + 分治NTT】
题目链接 CF960G 题解 同FJOI2016只不过数据范围变大了 考虑如何预处理第一类斯特林数 性质 \[x^{\overline{n}} = \sum\limits_{i = 0}^{n}\be ...
- Codeforces960G Bandit Blues 【斯特林数】【FFT】
题目大意: 求满足比之前的任何数小的有A个,比之后的任何数小的有B个的长度为n的排列个数. 题目分析: 首先写出递推式,设s(n,k)表示长度为n的排列,比之前的数小的数有k个. 我们假设新加入的数为 ...
- CF960G Bandit Blues 分治+NTT(第一类斯特林数)
$ \color{#0066ff}{ 题目描述 }$ 给你三个正整数 \(n\),\(a\),\(b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数,定义 \(B\) 为一个排列中是后缀最大 ...
- 【CF960G】Bandit Blues(第一类斯特林数,FFT)
[CF960G]Bandit Blues(第一类斯特林数,FFT) 题面 洛谷 CF 求前缀最大值有\(a\)个,后缀最大值有\(b\)个的长度为\(n\)的排列个数. 题解 完完全全就是[FJOI] ...
- CF960G Bandit Blues(第一类斯特林数)
传送门 可以去看看litble巨巨关于第一类斯特林数的总结 设\(f(i,j)\)为\(i\)个数的排列中有\(j\)个数是前缀最大数的方案数,枚举最小的数的位置,则有递推式\(f(i,j)=f(i- ...
- 【cf960G】G. Bandit Blues(第一类斯特林数)
传送门 题意: 现在有一个人分别从\(1,n\)两点出发,包中有一个物品价值一开始为\(0\),每遇到一个价值比包中物品高的就交换两个物品. 现在已知这个人从左边出发交换了\(a\)次,从右边出发交换 ...
随机推荐
- 解析和遍历一个HTML文档
如何解析一个HTML文档: String html = "<html><head><title>First parse</title>< ...
- mfc HackerTools监控键盘按键
string GetKey(int Key) { string KeyString = ""; //判断符号输入 const int KeyPressMask = 0x800000 ...
- git撤销已经push到远程仓库上的代码
具体方法,git命令:git reset --hard <commit_id>git push origin HEAD --force commit_id可以通过git命令:git log ...
- windows安装trojan记录
1.trojan 客户端安装教程 https://v2raytech.com/trojan-clients/ 2.chrome安装插件(crx文件)教程 https://www.jianshu.com ...
- 理解ASP.NET Core - [03] Dependency Injection
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 依赖注入 什么是依赖注入 简单说,就是将对象的创建和销毁工作交给DI容器来进行,调用方只需要接 ...
- Docker | 入门 & 基础操作
Dcoker 入门 确保docker 已经安装好了,如没有装好的可以参考:Docker | 安装 运行第一个容器 docker run -it ubuntu /bin/bash docker run ...
- springmvc图片上传、json
springmvc的图片上传 1.导入相应的pom依赖 <dependency> <groupId>commons-fileupload</groupId> < ...
- 基于Vue+Vuex+Vue-Router+axios+mint-ui的移动端电商项目
第一步:安装Node 1.打开NodeJS的官网,下载和自己系统相配的NodeJS的安装程序,包括32位还是64位一定要选择好,否则会出现安装问题. 下载地址:https://nodejs.org/e ...
- noip模拟33
\(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...
- 基于ECDHE的TLS握手流程
<!doctype html>3.3 基于ECDHE的TLS握手流程 html { overflow-x: initial !important } :root { --bg-color: ...