loj6077. 「2017 山东一轮集训 Day7」逆序对
题目描述:
题解:
容斥+生成函数。
考虑加入的第$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;
}
loj6077. 「2017 山东一轮集训 Day7」逆序对的更多相关文章
- LOJ6077「2017 山东一轮集训 Day7」逆序对 (生成函数+多项式exp?朴素DP!)
题面 给定 n , k n,k n,k ,求长度为 n n n 逆序对个数为 k k k 的排列个数,对 1 e 9 + 7 \rm1e9+7 1e9+7 取模. 1 ≤ n , k ≤ 100 ...
- 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP
[LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...
- loj #6077. 「2017 山东一轮集训 Day7」逆序对
#6077. 「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...
- 「2017 山东一轮集训 Day7」逆序对
题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai (ai<i) )= ...
- 题解 「2017 山东一轮集训 Day7」逆序对
题目传送门 Description 给定 $ n, k $,请求出长度为 $ n $ 的逆序对数恰好为 $ k $ 的排列的个数.答案对 $ 10 ^ 9 + 7 $ 取模. 对于一个长度为 $ n ...
- LOJ #6119. 「2017 山东二轮集训 Day7」国王
Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...
- loj6119 「2017 山东二轮集训 Day7」国王
题目描述 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当这条路径上的工 ...
- loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】
首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...
- LOJ6079「2017 山东一轮集训 Day7」养猫
养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的“最大”,使得至少每k个有me个e, 通过最大流的“上界”,限制每k个最多 ...
随机推荐
- CentOS7+Rsyslog+MySQL 搭建 Rsyslog 日志服务器
文章目录 1.主机环境 2.rsyslog搭建 2.1.rsyslog-server搭建 2.2.rsyslog-client 2.2.1.测试 2.3.rsyslog日志分类 2.3.1.测试 3. ...
- 【曹工杂谈】Mysql-Connector-Java时区问题的一点理解--写入数据库的时间总是晚13小时问题
背景 去年写了一篇"[曹工杂谈]Mysql客户端上,时间为啥和本地差了整整13个小时,就离谱",结果最近还真就用上了. 不是我用上,是组内一位同事,他也是这样:有个服务往数据库in ...
- 6.Flink实时项目之业务数据分流
在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...
- python开启httpserver
- DHCPv4 Relay场景测试—信而泰网络测试仪实操
一.测试说明 本文主要介绍DHCPv4 Relay场景的测试仪配置方法以及需要注意的事项. DHCPv4 Relay原理: DHCP中继代理,就是在DHCP服务器和客户端之间转发DHCP数据包.当DH ...
- xls/csv文件转换成dbf文件
转至:https://blog.csdn.net/linhai1028/article/details/80211252 编写的一个小脚本,主要是利用python中的pandas,xlrd,dbfpy ...
- Spark分区数、task数目、core数目、worker节点数目、executor数目梳理
Spark分区数.task数目.core数目.worker节点数目.executor数目梳理 spark隐式创建由操作组成的逻辑上的有向无环图.驱动器执行时,它会把这个逻辑图转换为物理执行计划,然后将 ...
- Pandas:plot相关函数
0.注意事项 及 各种错误 1)绘制bar图时,如果出现重复的x值被合并到一个情况(导致X轴应该显示内容有缺失),可能是由于Pandas版本太低: 2)无法设置中文title,在代码中加入两句话: p ...
- k8s全方位监控中-常用rules配置
[root@VM_0_48_centos prometheus]# cat alertmanager-configmap.yaml apiVersion: v1 kind: ConfigMap met ...
- .NET的两种部署模式,了解一下
前言 以往部署程序一直是习惯性先安装运行时环境,然后再将发布打包好的程序运行起来:但当多个程序依赖不同版本框架平台时,如果部署在同一台机器上,那就需要在同一台机器上安装多个版本的运行时,总感觉有点不太 ...