【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP
【LOJ6077】「2017 山东一轮集训 Day7」逆序对
题目描述
给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数。答案对 109+7 取模。
对于一个长度为 n 的排列 p ,其逆序对数即满足 i<j 且 pi>pj 的二元组 (i,j)的数量。
输入格式
一行两个整数 n,k。
输出格式
一行,表示答案。
样例输入
7 12
样例输出
531
数据范围与提示
对于 20% 的数据,n,k≤20;
对于 40% 的数据,n,k≤100;
对于 60% 的数据,n,k≤5000;
对于 100% 的数据,$1 \leq n, k \leq 100000, 1 \leq k \leq \binom{n}{2}$。
题解:本人第一思路是生成函数,但是想了想模数1e9+7没法搞,后来发现这个思路还真的是对的。(还真的有人拿生成函数A了,太神了)
首先从小到大插入第i个数时,逆序对数可能增加0,1,2,...i-1,所以最终得到的生成函数就是
$f(n)=1\times(1+x)\times(1+x+x^2)\times(1+x+x^2+x^3)...$
$f(n)={\prod\limits_{i=1}^n(1-x^i)\over(1-x)^n}$
下面那个东西很好求,${1\over (1-x)^n}=(1+x+x^2+...)^n=\sum C_{i+n-1}^{n-1}x^i$,然后我们考虑上面那个东西有什么意义。
你可以理解为第i项的系数是:有n个数,1,2,3...n,从中选出j个数使得总和为i的方案数$\times(-1)^j$。
这就大大简化了我们的问题,我们令f[j][i]表示选出j个数总和为i的方案数,显然j是$\sqrt{i}$级别的。
但是我们选出来的j个数并不能重复,所以这个问题还是比较难处理的,我们可以再转化一下,求长度为j,每个数在[1,n]之间,总和为i的上升序列的方案数。
如何构造出所有的上升序列呢?我们考虑将这个序列逆向差分$(b_i=a_i-a_{i+1})$,于是这个序列的总和就变成了$\sum\limits_{k=1}^jb_k\times k$。我们只需要满足$b_k>0$即可。
这时就容易DP了,f[i][j]可以由这几种状态转移而来:
如果i>=j,我们可以将bj++,那么f[j][i]+=f[j][i-j];我们还可以在bj后面增加一个1,那么f[j][i]+=f[j-1][i-j]。
如果i>n,此时可能出现a序列的最后一项>n的情况,即b序列的总和>n的情况,那么f[j][i]-=f[j-1][i-n-1]即可。
最后统计一下答案即可,时间复杂度$O(k\sqrt{k})$
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=100010;
const int M=450;
const int P=1000000007;
typedef long long ll;
ll jc[N<<1],jcc[N<<1],ine[N<<1];
ll ans;
int f[M][N];
int n,k;
inline ll c(int a,int b)
{
if(a<b) return 0;
return jc[a]*jcc[b]%P*jcc[a-b]%P;
}
inline void upd(int &x,int y)
{
x+=y;
if(x>=P) x-=P;
}
int main()
{
scanf("%d%d",&n,&k);
int i,j;
ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
for(i=2;i<=n+k;i++) jc[i]=jc[i-1]*i%P,ine[i]=P-(P/i)*ine[P%i]%P,jcc[i]=jcc[i-1]*ine[i]%P;
f[0][0]=1;
for(i=1;i<M;i++)
{
for(j=i;j<=k;j++)
{
if(j>=i) upd(f[i][j],f[i][j-i]),upd(f[i][j],f[i-1][j-i]);
if(j>n) upd(f[i][j],P-f[i-1][j-n-1]);
}
}
for(i=0;i<=k;i++)
{
ll tmp=0;
for(j=0;j<M;j++) tmp+=((j&1)?-1:1)*f[j][i];
tmp=(tmp%P+P)%P;
ans=(ans+tmp*c(k-i+n-1,n-1))%P;
}
printf("%lld",ans);
return 0;
}
【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP的更多相关文章
- loj6077. 「2017 山东一轮集训 Day7」逆序对
题目描述: loj 题解: 容斥+生成函数. 考虑加入的第$i$个元素对结果的贡献是$[0,i-1]$,我们可以列出生成函数. 长这样:$(1)*(1+x)*(1+x+x^2)*--*(1+x+x^2 ...
- 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 ...
- 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个最多 ...
随机推荐
- nuget类库xml说明以及类库说明文件添加到包中
1.nuget包制作添加xml操作:项目右键属性,生成配置输出xml文档文件,debug,release都配置一下,项目右键 yesway.redis.csproj 文件增加: 添加类库说明文件con ...
- SpringMVC由浅入深day01_12参数绑定(12.1参数绑定过程_12.2默认支持的类型_12.3简单类型)
12 参数绑定 处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上. 注解适配器对RequestMapping标记的方法进行适配,对方法中的 ...
- SpringMVC由浅入深day01_10@RequestMapping_11controller方法的返回值
10 @RequestMapping 10.1 Url路径映射 @RequestMapping(value="/item")或@RequestMapping("/item ...
- SpringMVC由浅入深day01_3非注解的处理器映射器和适配器
3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 3.1.1 HandlerMapping处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler ...
- android studio 使用 SVN
通过android studio来进行版本控制,先前已经安装了TortoiseSVN-1.9.2,但是在打开android studio的时候会出现 Can't use Subversion comm ...
- 【代码审计】DouPHP_v1.3代码执行漏洞分析
0x00 环境准备 DouPHP官网:http://www.douco.com/ 程序源码下载:http://down.douco.com/DouPHP_1.3_Release_20171002. ...
- X-WAF简单测试体验
X-WAF 最近才关注到的一款云WAF,花了一些时间搭建了一个环境,并做了一些测试,感觉比较适合新手来练习WAF Bypass. X-WAF是一款适用中.小企业的云WAF系统,让中.小企业也可以非常方 ...
- MongoDB(四)-- 主从配置
一.前言 虽然MongoDB官方已经不建议使用主从模式了,但是 熟悉下 也是有用的,替代方案是采用副本集的模式.slave默认情况下是不支持读写的,但是master会把数据同步到slave,不支持客户 ...
- [Python] First-class Everything (Python缔造者Guido van Rossum关于bound/unbound method的来历叙述)
First-class Everything -- Guido van Rossum First-class object: 第一类对象.意指可在执行期创建并作为参数传递给其他函数或存入一个变量的对象 ...
- 在javaweb的项目当中实现随机数字的生成
首先,需要在javaweb的项目当中新建一个Servlet文件,然后再web.xml中配置一下: 这样运行的时候就可以通过“http://localhost:8080/Response/Respons ...