题面

传送门

题解

这居然是一道语文题?

首先不难看出,因为每一次相邻元素交换最多减少一个逆序对,所以至少\(m\)次交换就代表这个序列的逆序对个数为\(m\)

我们考虑一下,假设现在已经放完了\(i-1\)个数,当放入第\(i\)个数的时候会对逆序对个数造成什么影响

如果第\(i\)个数放在最后,新增逆序对个数为\(0\),如果插在最后一个数前面,新增逆序对为\(1\)……

综上,第\(i\)个数插入之后新加的逆序对数为\(0,1,...,i-1\)

那么不难看出,新增逆序对数的这个数列,和原序列是有一一对应关系的

那么我们就可以把它写成生成函数的形式了,题目转为求

\[\prod_{k=1}^n\left(\sum_{i=0}^{k-1}x^i\right)
\]

的第\(m\)次项的系数

然后就要开始推倒了

\[\prod_{k=1}^n\left(\sum_{i=0}^{k-1}x^i\right)=\prod_{k=1}^n{1-x^k\over 1-x}=\left(1\over 1-x\right)^n\prod_{k=1}^n(1-x^k)
\]

所以直接上多项式即可

我们来考虑两个柿子的组合意义

\({1\over 1-x}=\sum_{i=0}^\infty x^i\),那么\(\left(1\over 1-x\right)^n\)的第\(k\)项系数就代表\(a_1+a_2+...+a_n=k\)的非负整数解的个数,根据隔板法可得它的第\(k\)项系数为\({k+n-1\choose n-1}\)

然后考虑后面那个,可以看做有\(n\)个物品,第\(i\)个物品体积为\(i\),求用这些物品填满体积为\(k\)的背包的方案数,有符号

这就相当于是一个背包,因为背包内部是无序的,所以它等价于求和为\(k\)的严格上升子序列的个数

我们设\(f_{i,j}\)表示长度为\(i\),和为\(j\)的严格上升子序列的个数,然后考虑这玩意儿怎么转移

可以新增一个物品,那么方案数为\(f_{i-1,j-i}\)(先把所有物品\(+1\),再新放入一个\(1\)进去)

也可以不放物品,把所有数\(+1\),方案数为\(f_{i,j-i}\)

不过这样转移可能会有不合法的,因为放的数最大值不能超过\(n\),所以要减去\(f_{i-1,j-(n+1)}\)

记得前面要带上符号

即为

\[f_{i,j} = f_{i,j-i} - f_{i-1,j-i} - (-f_{i-1,j-(n+1)})
\]

因为每种体积的物品最多一个,所以放的物品最多不超过\(O(\sqrt{m})\)

那么多项式\(\prod_{k=1}^n(1-x^k)\)第\(i\)项的系数就是\(\sum_j f_{j,i}\)

然后把这两个多项式卷个积就能得到答案了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=2e5+5,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int fac[N],ifac[N],f[N],g[N],dp[555][N];
int n,m,res;
inline int C(R int n,R int m){return m>n?0:1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
fac[0]=ifac[0]=1;fp(i,1,n+m)fac[i]=mul(fac[i-1],i);
ifac[n+m]=ksm(fac[n+m],P-2);fd(i,n+m-1,1)ifac[i]=mul(ifac[i+1],i+1);
fp(i,0,m)f[i]=C(i+n-1,n-1);
dp[0][0]=1,g[0]=1;
int d=1;
fp(j,2,m)if((1ll*j*(j+1)>>1)>=m){d=j;break;}
fp(i,1,d){
fp(j,0,m){
j>=i?dp[i][j]=dec(dp[i][j-i],dp[i-1][j-i]):0;
j>=n+1?dp[i][j]=add(dp[i][j],dp[i-1][j-n-1]):0;
}
fp(j,0,m)g[j]=add(g[j],dp[i][j]);
}
fp(i,0,m)res=add(res,mul(f[i],g[m-i]));
printf("%d\n",res);
return 0;
}

洛谷T46780 ZJL 的妹子序列(生成函数)的更多相关文章

  1. BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...

  2. 洛谷P2501 bzoj1049 [HAOI2006]数字序列

    题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...

  3. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  4. 洛谷P4389 付公主的背包--生成函数+多项式

    题目链接戳这里 题目描述 有\(n\)件不同的商品,每件物品都有无限个,输出总体积为\([1,m]\)的方案数 思路 直接跑背包有\(30\) 考虑把每个物品的生成函数设出来,对于一件体积为\(v\) ...

  5. 【洛谷P4144】大河的序列

    题目大意:给定一个长度为 N 的序列,求序列中连续区间最大的(或和加与和)是多少. 题解: 引理:任意两个数 \(i, j\),若 \(i>j\),则在二进制表示下,i 对应的二进制串的字典序一 ...

  6. 【洛谷P3917】异或序列

    题目大意:给定一个长度为 N 的序列,每个位置有一个权值,求 \[\sum\limits_{1\le i\le j\le n}(a_i\oplus a_{i+1}...\oplus a_j)\] 的值 ...

  7. 【洛谷P4462】异或序列

    题目大意:给定一个长度为 N 的序列,有 M 组询问,每组询问查询区间 [l,r] 内异或和等于给定常数 K 的区间组数. 题解:对于异或和问题,一般先进行前缀和处理,转化为两个点的的关系.因此,经过 ...

  8. 洛谷P4389 付公主的背包 [生成函数,NTT]

    传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...

  9. 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]

    题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对 ...

随机推荐

  1. split files test

    python split_upload.py   /root/github/python/s3_test/test.txt    dbelt      dumps python download_to ...

  2. Lamber算法 & SurfaceShader自定义光照

    [SurfaceShader自定义光照] 1.在pragma中添加自定义光照函数名:  #pragma surface surf BasicDiffuse 2.实现自定义光照函数.下面就是Lamber ...

  3. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  4. cf478B-Random Teams 【排列组合】

    http://codeforces.com/problemset/problem/478/B B. Random Teams   n participants of the competition w ...

  5. int类型与char类型的转换

    ---------siwuxie095                 Java对char类型的数据在底层是按int类型来处理的 (只是显示出来仍然是字符型)         1.int类型与char ...

  6. 344. Reverse String 最基础的反转字符串

    [抄题]: [暴力解法]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: 还停留在 i < len / 2的阶段,不行,应该是指针对撞问题了 [一 ...

  7. Cloudstack4.2之改变数据卷容量的大小(Resize Data Volumes)

    下图标注了这个功能在cloudstack4.2 UI中的位置 在cloudstack中是通过磁盘服务来设定卷的大小的.管理员可以设置相应的磁盘服务以供用户来使用.为了增强系统的灵活性,方便最终用户的使 ...

  8. jQuery中deferred对象的使用(二)

    接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调. deferred对象的使用(二) deferred对象不光可 ...

  9. 并发编程CAS操作

    并发编程CAS操作 简介 CAS即compare and swap,中文就是比较并交换 CAS是Java并发包的基石 原理 其实CAS的原理相对来说比较简单.将要被改变的数据和期望的值作比较,当两个值 ...

  10. QT学习之常用类的总结

    QApplication 应用程序类 管理图形用户界面应用程序的控制流和主要设置       QPalate   QLabel 标签类 提供文本或者图像的显示   QPushButton 按钮类 提供 ...