【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的更多相关文章

  1. loj6077. 「2017 山东一轮集训 Day7」逆序对

    题目描述: loj 题解: 容斥+生成函数. 考虑加入的第$i$个元素对结果的贡献是$[0,i-1]$,我们可以列出生成函数. 长这样:$(1)*(1+x)*(1+x+x^2)*--*(1+x+x^2 ...

  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   ...

  3. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  4. 「2017 山东一轮集训 Day7」逆序对

    题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai   (ai<i)  )= ...

  5. 题解 「2017 山东一轮集训 Day7」逆序对

    题目传送门 Description 给定 $ n, k $,请求出长度为 $ n $ 的逆序对数恰好为 $ k $ 的排列的个数.答案对 $ 10 ^ 9 + 7 $ 取模. 对于一个长度为 $ n ...

  6. LOJ #6119. 「2017 山东二轮集训 Day7」国王

    Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...

  7. loj6119 「2017 山东二轮集训 Day7」国王

    题目描述 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当这条路径上的工 ...

  8. loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】

    首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...

  9. LOJ6079「2017 山东一轮集训 Day7」养猫

    养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的“最大”,使得至少每k个有me个e, 通过最大流的“上界”,限制每k个最多 ...

随机推荐

  1. C++的UML类图

    OOAD(object-oriented analysis and design)面向对象分析和设计 UML(Unified Modeling Language)统一建模语言.可以清晰表达任何OOAD ...

  2. Sublime的插件Color Highlighter的安装方法

    ColorHighlighter是一个显示选中颜色代码的视觉颜色的插件.如果您选择“# fff“,它将向您展示白色.ColorHighlighter支持所有CSS颜色格式,如Hex,RGB,HSL,H ...

  3. 使用srvany.exe将程序安装成windows服务的详细教程

    srvany.exe介绍 srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说srva ...

  4. ckeditor4.4.6添加代码高亮

    研究了很久才发现,在 ckeditor4.4.6中添加代码高亮超级简单啊,下面直接上过程 ckeditor4.4.6支持自定义代码高亮,利用Code Snippet插件并默认启用highlight.j ...

  5. zabbix中Templates的jmx相关key调试方法

    1.下载 cmdline jmxclient 如果你有一个完美的模版,你可能可以忽略此步.但是大多数情况下你没有.况且 zabbix 默认的 tomcat 模版也不能很好的工作.这时候有一个工具来调试 ...

  6. 使用librtmp进行H264与AAC直播

    libx264 版本是 128libfaac 版本是 1.28 1.帧的划分 1.1 H.264 帧 对于 H.264 而言每帧的界定符为 00 00 00 01 或者 00 00 01. 比如下面的 ...

  7. 【RF库测试】算法运算

  8. lua_gc源码学习

    最近发现在大数据量的 lua 环境中,GC 占据了很多的 CPU .差不多是整个 CPU 时间的 20% 左右.希望着手改进.这样,必须先对 lua 的 gc 算法极其实现有一个详尽的理解.我之前读过 ...

  9. 在linux下搭建ftp服务器【转】

    1 安装 vsftpd yum install vsftpd 2 配置 vsftpd 打开 vsftpd 文件: vi /etc/vsftpd/vsftpd.conf 初次修改前建议备份该文件 2.1 ...

  10. codeforces水题100道 第十九题 Codeforces Round #109 (Div. 2) A. I_love_%username% (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/155/A题意:找到当前最大值或者最小值出现的次数.“当前”的意思差不多是a[i]大于所有a[j]( ...