题面

传送门

题解

这居然是一道语文题?

首先不难看出,因为每一次相邻元素交换最多减少一个逆序对,所以至少\(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. 刷题向》一道逆向思维题(BZOJ1046)(NORMAL)

    这道题对于一类题都有一个通用思路:反向递减序列即为正向字典序. 对于逆向思维的题还要多做才能培养这种对于逆向思维的感觉. 想到这种方法之后,就很简单了. 因为n×m不会炸,所以反向LIS叠一个贪心就能 ...

  2. Codeforces 721E DP

    大概思路及题意看这篇博客吧 我的理解:设f[i]表示处理到第i个区间,能唱的最多的歌,g[i]是保证f[i]最大时最靠左的点.那么f[i] = max(f[j] + (r[i] - max(l[i], ...

  3. 待解决:2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()

    2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()

  4. Appium Windows安装

    安装环境 1 安装Nodejs 下载nodejs安装包(http://nodejs.org/download/)安装 测试安装是否成功:运行cmd,输入node -v 2 安装android的SDK ...

  5. java技术文章集

    RunOOB Java 教程 深入理解Java 8 Lambda spring MVC配置详解 各种参数传递示例代码 关于spring配置文件中ref属性的设定 Spring注解Annotation的 ...

  6. HUST软工1501-1503班第4周作业成绩公布

    说明 本次公布的成绩为第四周作业的结果: 第4周小组作业:WordCount优化 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第4周在线答疑区发帖申诉. 或直接在博客园本帖中进行评论进行申诉 ...

  7. CMDB小练习

    为什么要用CMDB? 因为公司之前统计资产信息用的是excel表格,随着业务的增加和信息的变更,这个表格变得越来越乱,所以我们就想着编写出一套自动管理资产信息的系统,实现自动管理资产信息 三种方案? ...

  8. UVALive 7752 Free Figurines (瞎搞)

    题意:给定 n 个盒子,然后告诉你每个盒子在哪个盒子里,数值越大,盒子越大,给定你初态,和末态,问你最少要几步能完成,只有两种操作,一种是把一个盒子连同里面的小盒子放到一个空盒子里,另一种是把一个堆盒 ...

  9. (转)打造一套UI与后台并重.net通用权限管理系统

    原文地址:http://www.cnblogs.com/LRBPMS/p/3425997.html 一.前言 从进行到软件开发这个行业现在已经有几年了,在整理出这个套开发框架之前自己做了不少重复造轮子 ...

  10. 启动samba服务--ubuntu 14.04

    1. 修改配置文件 /etc/samba/smb.conf文件末尾添加 [homes] comment = Home Directories browseable = yes read only = ...