题目链接:codeforces960G

来看看三倍经验:hdu4372 luogu4609

某蒟蒻的关于第一类斯特林数的一点理解QAQ:https://www.cnblogs.com/zhou2003/p/10780832.html

注意到当前序列的最大值会对前缀最大值和后缀最大值均产生\(1\)的贡献

那么当我们去掉这个最大值后,剩下\(n-1\)个元素,需要产生\(a-1\)个前缀最大值和\(b-1\)个后缀最大值,并且它们的位置会以最大值为界限分布在两侧

我们将剩下的\(n-1\)个元素分成\((a-1)+(b-1)\)组,每一组钦定最大值在最开头,那么每一个这样的划分就对应了一个合法的序列,最后答案就是\(S(n-1,a+b-2)*\dbinom{a+b-2}{a-1}\),其中\(S(n,m)\)表示第一类斯特林数

这样你就可以完成后两题了

那么对于第一题呢?我们有这个式子:

\[S(n,m)=[x^m]\prod_{i=0}^{n-1}(x+i)
\]

于是分治+FFT求之,据说有\(O(nlogn)\)的倍增做法?我懒啊

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 998244353
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
int n,a,b,rev[400400];
ll s[20][400400]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} ll qpow(ll x,int y)
{
ll ans=1;
while (y)
{
if (y&1) ans=(ans*x)%maxd;
x=(x*x)%maxd;
y>>=1;
}
return ans;
} ll inv(ll x) {return qpow(x,maxd-2);} ll C(int n,int m)
{
if (n<m) return 0;
ll ans=1;
per(i,n,n-m+1) ans=ans*i%maxd;
rep(i,1,m) ans=ans*inv(i)%maxd;
return ans;
} void ntt(int lim,ll *a,int typ)
{
rep(i,0,lim-1)
if (i<rev[i]) swap(a[i],a[rev[i]]);
int mid;
for (mid=1;mid<lim;mid<<=1)
{
ll wn=qpow(3,(maxd-1)/(mid<<1));
int len=(mid<<1),sta,j;
if (typ==-1) wn=inv(wn);
for (sta=0;sta<lim;sta+=len)
{
ll w=1;
for (j=0;j<mid;j++,w=(w*wn)%maxd)
{
ll x=a[sta+j],y=a[sta+j+mid]*w%maxd;
a[sta+j]=(x+y)%maxd;
a[sta+j+mid]=(x+maxd-y)%maxd;
}
}
}
if (typ==-1)
{
int invn=inv(lim);
rep(i,0,lim-1) a[i]=a[i]*invn%maxd;
}
} void solve(int l,int r,int d)
{
if (l==r) {s[d][0]=l;s[d][1]=1;return;}
int mid=(l+r)>>1;
solve(l,mid,d+1);
rep(i,0,mid-l+1) s[d][i]=s[d+1][i];
solve(mid+1,r,d+1);
int lim=1,cnt=0;
while (lim<=(r-l+1)) {lim<<=1;cnt++;}
rep(i,mid-l+2,lim) s[d][i]=0;
rep(i,r-mid+1,lim) s[d+1][i]=0;
rep(i,0,lim-1)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(cnt-1));
ntt(lim,s[d],1);ntt(lim,s[d+1],1);
rep(i,0,lim-1) s[d][i]=s[d][i]*s[d+1][i]%maxd;
ntt(lim,s[d],-1);
} int main()
{
n=read();a=read();b=read();
if ((n-1<a+b-2) || (!a) || (!b)) {printf("0");return 0;}
if (n==1) {printf("1");return 0;}
solve(0,n-2,0);
printf("%lld",C(a+b-2,a-1)*s[0][a+b-2]%maxd);
return 0;
}

codeforces960G. Bandit Blues的更多相关文章

  1. Codeforces960G Bandit Blues 【斯特林数】【FFT】

    题目大意: 求满足比之前的任何数小的有A个,比之后的任何数小的有B个的长度为n的排列个数. 题目分析: 首先写出递推式,设s(n,k)表示长度为n的排列,比之前的数小的数有k个. 我们假设新加入的数为 ...

  2. 【CF960G】Bandit Blues(第一类斯特林数,FFT)

    [CF960G]Bandit Blues(第一类斯特林数,FFT) 题面 洛谷 CF 求前缀最大值有\(a\)个,后缀最大值有\(b\)个的长度为\(n\)的排列个数. 题解 完完全全就是[FJOI] ...

  3. 【CF960G】Bandit Blues

    [CF960G]Bandit Blues 题面 洛谷 题解 思路和这道题一模一样,这里仅仅阐述优化的方法. 看看答案是什么: \[ Ans=C(a+b-2,a-1)\centerdot s(n-1,a ...

  4. Luogu P4609 [FJOI2016]建筑师&&CF 960G Bandit Blues

    考虑转化题意,我们发现其实就是找一个长度为\(n\)的全排列,使得这个排列有\(A\)个前缀最大值,\(B\)个后缀最大值,求方案数 我们考虑把最大值拎出来单独考虑,同时定义一些数的顺序排列为单调块( ...

  5. [CF960G] Bandit Blues

    题意 给你三个正整数 \(n,a,b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数,定义 \(B\) 为一个排列中是后缀最大值的数的个数,求长度为 \(n\) 的排列中满足 \(A = a ...

  6. CF960G Bandit Blues 第一类斯特林数、NTT、分治/倍增

    传送门 弱化版:FJOI2016 建筑师 由上面一题得到我们需要求的是\(\begin{bmatrix} N - 1 \\ A + B - 2 \end{bmatrix} \times \binom ...

  7. 解题:CF960G Bandit Blues & FJOI 2016 建筑师

    题面1 题面2 两个题推导是一样的,具体实现不一样,所以写一起了,以FJOI 2016 建筑师 的题面为标准 前后在组合意义下一样,现在只考虑前面,可以发现看到的这a个建筑将这一段划分成了a-1个区间 ...

  8. Codeforces 960G. Bandit Blues

    Description 你需要构造一个长度为 \(n\) 的排列 , 使得一个数作为前缀最大值的次数为 \(A\) , 作为后缀最大值的次数为 \(B\) , 求满足要求的排列个数 . 题面 Solu ...

  9. CF960G Bandit Blues 【第一类斯特林数 + 分治NTT】

    题目链接 CF960G 题解 同FJOI2016只不过数据范围变大了 考虑如何预处理第一类斯特林数 性质 \[x^{\overline{n}} = \sum\limits_{i = 0}^{n}\be ...

随机推荐

  1. RAC(ReactiveCocoa)介绍(一)

    最近在学习RAC,之前在iOS工作中,类之间的传值,无非是block.delegate代理.KVO和Notification等这几种方法.在RAC中,同样具备替代block.delegate代理.KV ...

  2. WPF 水印TextBox WatermarkTextBox

    //https://blog.csdn.net/puchitomato/article/details/12248691 转自以上链接,自己添加了Enter响应事件.    public class ...

  3. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

  4. es6之三个点(...)扩展运算符

    我们看一个语法,你就知道es6对我们码农多友好,毕竟世界在进步 let arr=[1,2,3,4,54,56] console.log(...arr) 结果是????? 没错 ...这个运算符就是把这 ...

  5. web开发布局---传统布局篇

    1.传统布局 盒状模型结合 display 属性.float 浮动以及 position 定位属性设计的各式传统布局形式. 2.说再多不如动手实践,下面举三个例子 html 部分代码: <sec ...

  6. FineReport数据库连接(oracle+plsql)(1)

    一.  数据库建表 数据库是Oracle12c,工具是plsql.具体操作百度即可,此处不赘述.(图1) 图1 二.  FineReport中建立数据库连接 在上方选项卡中单击服务器,选择定义数据连接 ...

  7. Android View的重绘过程之Measure

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,  测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,Vie ...

  8. 好代码是管出来的——使用GitHub

    前面的文章介绍了Git的基本概念和用法,本文则是基于GitHub的一个实践介绍,主要内容有: GitHub简介 个人与组织 仓库的创建与维护 Fork与pull request 小结 GitHub简介 ...

  9. vsftpd.configro

    mmp卸载了vsftpd后 配置文件没了 安装也没有 留个做备份 嘿嘿 原始的: # Please see vsftpd.conf. for all compiled in defaults. # # ...

  10. Golang学习:sublime text3配置golang环境

    最近导师让学习golang, 然后我就找了些有关golang的学习视频和网站. 昨天在电脑上下载了go tools, 之后在sublime上配置了golang的运行环境.By the way, 我的电 ...