loj6077. 「2017 山东一轮集训 Day7」逆序对
题目描述:
loj
题解:
容斥+生成函数。
考虑加入的第$i$个元素对结果的贡献是$[0,i-1]$,我们可以列出生成函数。
长这样:$(1)*(1+x)*(1+x+x^2)*……*(1+x+x^2+……+x^{n-1})=\frac{\prod_{i=1}^{n}1-x^i}{(1-x)^n}$
把分母提出来:$\frac{1}{(1-x)^n} = (1+x+x^2+……)^n = \sum_{i=0}^{k} C_{i+n-1}^{n-1}$,日常小球放盒。
现在还剩$\prod_{i=1}^n 1-x^i$,可以考虑将该式理解为从$1$到$n$选$i$个数,总和为$j$,对该项系数贡献为$(-1)^i$。
由于从$1$到$n$不重复,可以发现$\sum_{i=1}^{447}>100000$,那么$i \le 447$。
那么就可以$dp$了。状态为$f[i][j]$,表示当前选了$i$个数总和为$j$,且最后一项不大于$n$的方案数。
要求选数不重复怎么办?
考虑将其构造成一个上升序列。我们用枚举差值的思想,保证前后差值大于$0$。
转移有三种:
1.将$i$个数集体+1,此时$f[i][j]+=f[i][j-i]$;
2.将$i$个数集体+1再在最前面加入一个1,此时$f[i][j]+=f[i-1][j-i]$;
3.考虑我们每次都让每个数+1,所以当$j>n$时会出现最后一项为$n+1$的情况,此时$f[i][j]-=f[i-1][j-n-1]$;
这样转移就可以了。
最后卷积卷出第$k$位的值就可以了。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int MOD = 1000000007; const int N = 100050; const int M = 450; int fastpow(int x,int y) {int ret = 1;while(y){if(y&1)ret=1ll*ret*x%MOD;x=1ll*x*x%MOD;y>>=1;}return ret; } template<typename T> inline void Mod(T&x){if(x>=MOD)x-=MOD;} int n,m; int jc[N<<1],jny[N<<1],f[M][N]; void init() {jc[0] = 1;for(int i=1;i<=n+m;i++)jc[i]=1ll*jc[i-1]*i%MOD;jny[n+m] = fastpow(jc[n+m],MOD-2);for(int i=n+m;i;i--)jny[i-1]=1ll*jny[i]*i%MOD; } int C(int x,int y){return 1ll*jc[x]*jny[y]%MOD*jny[x-y]%MOD;}int main() {scanf("%d%d",&n,&m);init();f[0][0] = 1;for(int i=1;i<M;i++)for(int j=i;j<=m;j++){Mod(f[i][j] = f[i-1][j-i]+f[i][j-i]);if(j>n)Mod(f[i][j]+=MOD-f[i-1][j-n-1]);}int ans = 0;for(int i=0;i<=m;i++){int tmp = 0;for(int j=0;j<M;j++)if(j&1)Mod(tmp+=MOD-f[j][i]);else Mod(tmp+=f[j][i]);Mod(ans+=1ll*tmp*C(n+m-i-1,n-1)%MOD);}printf("%d\n",ans);return 0; }
View Code
转载于:https://www.cnblogs.com/LiGuanlin1124/p/11136070.html
loj6077. 「2017 山东一轮集训 Day7」逆序对相关推荐
- Loj #6077. 「2017 山东一轮集训 Day7」逆序对
Loj #6077. 「2017 山东一轮集训 Day7」逆序对 Solution 令fi,jf_{i,j}fi,j表示前iii个数产生jjj个逆序对的方案数,每次考虑把i+1i+1i+1加入,有i ...
- 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对
文章目录 Co-prime source solution code Character Encoding source solution code Tree and Constraints sour ...
- LOJ6079「2017 山东一轮集训 Day7」养猫
养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的"最大",使得至少每k个有me个e, 通过最大流的&q ...
- #6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)
#6073. 「2017 山东一轮集训 Day5」距离 给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集 ...
- LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告
LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告 好苹果会组成连通块,整棵树的权值为 ∑ i = 1 n c i [ c i ≥ 0 ] [ s i z n u m ( c i ...
- LOJ#6074. 「2017 山东一轮集训 Day6」子序列
LOJ#6074. 「2017 山东一轮集训 Day6」子序列 先考虑全局询问怎么做,设 f ( i , c ) f(i,c) f(i,c) 表示在 S 1 ⋯ i S_{1\cdots i} S1⋯ ...
- LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告
LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...
- 「2017 山东一轮集训 Day5」距离
/* 写完开店再写这个题目顿时神清气爽, 腰也不疼了, 眼也不花了首先考虑将询问拆开, 就是查询一些到根的链和点k的关系根据我们开店的结论, 一个点集到一个定点的距离和可以分三部分算 那么就很简单了吧 ...
- [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]
题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...
- 「2017 山东一轮集训 Day2」Pair (霍尔定理+线段树)
题目描述 给出一个长度为 的数列 和一个长度为 的数列 ,求 有多少个长度为 的连续子数列能与 匹配. 两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对 ...
最新文章
- SQLite中的SELECT子句
- legend3---laravel中获取控制器名称和方法名称
- vue项目使用eslint
- Java中的wait()和sleep()方法之间的区别
- 隔离式BUCK之参数计算
- c语言微信挑一挑编程,100行python代码实现微信跳一跳辅助程序
- e470c拆机图解全拆 thinkpad_ThinkPad 拆机教程,更新特别部分,很特别哟!!!
- 27000系列标准族谱
- Js实现实时显示系统时间(获取当前时间并显示)
- 给计算机图片文件夹加密码,文件夹加密软件如何给照片文件夹加密
- java重复执行方法_重复java方法
- 《操作系统真象还原》——0.6 为什么称为“陷入”内核
- CodeForces 1538G : Gift Set 思维 + 二分
- 基于微信小程序的校园互助平台
- 码农和CTO的差距到底在哪?
- 谷歌MIT:微小运动放大算法的实现
- 百度智能小程序微信群
- 短视频+直播源码,直播老司机带你飞
- html css在线申请页面,25个在线工作申请免费HTML的简历模板
- 关于浏览器请求PHP一次请求执行了两次
热门文章
- 一句话可以改变人的一生
- 「leetcode」C++题解:239. 滑动窗口最大值,单调队列的经典题目
- Illustrator中文版教程,如何在 Illustrator 中快速连接和修剪路径?
- Illustrator 教程,如何在 Illustrator 中编辑路径?
- 如何从 Mac 上的“照片”中导出照片、视频和幻灯片放映?
- git不同的平台配置不同的公钥秘钥(git配置多个公钥秘钥)(git不同的项目配置不同的公钥秘钥)
- iOS开发之千位分隔符(千位符)
- iOS开发之iOS11、iPhone X、Xcode9 适配指南
- Vitamin-R for Mac(GTD工作效率管理工具)
- 在 macOS 中如何使用「预览」批量调整图片大小?