题面

传送门

题解

这居然是一道语文题?

首先不难看出,因为每一次相邻元素交换最多减少一个逆序对,所以至少\(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. Python与Go斐波那契数列

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 斐波那契数列 def fibonacci_sequence(num): aa = 0 b = 1 li ...

  2. HttpClient由Client客户端上传File文件流至Server服务端

    客户端方法 public static void main(String[] args) { File file=new File("E:\\lucene\\rev\\全年平台受理量.doc ...

  3. sqlserver 时间函数用法

    1.DATEADD(datepart,number,date) 现在,我们希望向 "OrderDate" 添加 2 天,这样就可以找到付款日期,我们使用如下 SELECT 语句: ...

  4. 单例模式的N种写法

    单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何 ...

  5. PollingProvider方法的使用及示例

    来自<sencha touch权威指南>第12章,374页开始 ----------------------------------------------------- PollingP ...

  6. Linux编程实现蜂鸣器演奏康定情歌

    Linux编程实现蜂鸣器演奏康定情歌 摘自:https://blog.csdn.net/jiazhen/article/details/3490979   2008年12月10日 15:40:00 j ...

  7. Eclipse集成tomcat

    1.window --> Preferences 2.搜索runtime,选择Runtime Environments,点击add按钮 3.选择tomacat的版本,我的版本是7.x的,所以选择 ...

  8. UVa 11996 Jewel Magic (splay + Hash + 二分)

    题意:给定一个长度为n的01串,你的任务是依次执行如表所示的m条指令: 1 p c 在第p个字符后插入字符,p = 0表示在整个字符串之前插入2 p 删除第p个字符,后面的字符往前移3 p1 p2反转 ...

  9. HDU 6125 Free from square (状压DP+背包)

    题意:问你从 1 - n 至多选 m 个数使得他们的乘积不能整除完全平方数. 析:首先不能整除完全平方数,那么选的数肯定不能是完全平方数,然后选择的数也不能相同的质因子. 对于1-500有的质因子至多 ...

  10. C# 自带的.net类库 实现得到本机IP以及网关地址

    今天需要用到一个功能,获取主机名和本机的IP 准备用API实现的,然后稍微查了一下,发现.net类库已经有了 就在System.Net命名空间中的DNS类中 GetHostName 获取本地计算机的主 ...