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

 

题目描述

给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数。答案对 109+7 10 ^ 9 + 710​9​​+7 取模。

对于一个长度为 n nn 的排列 p pp,其逆序对数即满足 i<j i < ji<j 且 pi>pj p_i > p_jp​i​​>p​j​​ 的二元组 (i,j) (i, j)(i,j) 的数量。

输入格式

一行两个整数 n,k n, kn,k。

输出格式

一行,表示答案。

样例

样例输入

7 12

样例输出

531

数据范围与提示

对于 20% 20\%20% 的数据,n,k≤20 n, k \leq 20n,k≤20;
对于 40% 40\%40% 的数据,n,k≤100 n, k \leq 100n,k≤100;
对于 60% 60\%60% 的数据,n,k≤5000 n, k \leq 5000n,k≤5000;
对于 100% 100\%100% 的数据,1≤n,k≤100000,1≤k≤(n2) 1 \leq n, k \leq 100000, 1 \leq k \leq \binom{n}{2}1≤n,k≤100000,1≤k≤(​2​n​​)。

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000000007
#define maxn 5002
using namespace std;
int dp[maxn][maxn],n,sum[maxn][maxn],m;
int Max(int x,int y){return x>y?x:y;}
int Min(int x,int y){return x<y?x:y;}
int main(){
scanf("%d%d",&n,&m);m++;
dp[][]=;
sum[][]=;
int lim,i,j,l,r;
for(i=;i<=n;++i){
lim=(i-)*i/+;
for(j=;j<=min(lim,m);++j){
l=Max(j-i,);r=Min(j,(i-)*(i-)/+);
dp[i][j]=sum[i-][r]-sum[i-][l];
if(dp[i][j]<)dp[i][j]+=mod;
else if(dp[i][j]>=mod)dp[i][j]-=mod;
sum[i][j]=sum[i][j-]+dp[i][j];
if(sum[i][j]>=mod)sum[i][j]-=mod;
}
}
printf("%d",dp[n][m]);
return ;
}

60分 dp+前缀和优化

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define maxn 200010
#define mod 1000000007
using namespace std;
int n,k,S;
long long f[][maxn],inv[maxn],fac[maxn],a[maxn];
long long C(int n,int m){
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
long long Pow(long long x,int y){
long long res=;
while(y){
if(y&)res=res*x%mod;
x=x*x%mod;
y>>=;
}
return res;
}
int main(){
scanf("%d%d",&n,&k);
S=sqrt(k<<)+;
f[][]=;
for(int i=;i<=S;i++)
for(int j=i;j<=k;j++){
f[i][j]=(f[i][j-i]+f[i-][j-i])%mod;
if(j>n)f[i][j]=(f[i][j]-f[i-][j-n-])%mod;
}
fac[]=inv[]=;
for(int i=;i<=k+n;i++){
fac[i]=1LL*fac[i-]*i%mod;
inv[i]=Pow(fac[i],mod-);
}
long long ans=C(n+k-,n-);
for(int i=;i<=S && i<=n;i++){
long long cur=;
for(int j=;j<=k;j++)
cur=(cur+f[i][j]*C(n+k-j-,n-))%mod;
if(i&)cur=-cur;
ans=(ans+cur)%mod;
}
ans=(ans+mod)%mod;
cout<<ans;
}

100分

loj #6077. 「2017 山东一轮集训 Day7」逆序对的更多相关文章

  1. 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP

    [LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...

  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. loj6077. 「2017 山东一轮集训 Day7」逆序对

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

  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. loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】

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

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. redis学习四 复制

    1,单机创建多实例 一个redis服务器安装多个redis实例,每个实例对应一个端口.默认端口是6379. 将redis.conf配置文件复制一份到另外一个文件夹下,然后修改其中的信息即可.   pi ...

  2. CentOS6.5 释放SWAP

      虚拟内存的释放一般都是伴随着关闭应用程式来说的   可以通过命令刷新swap还原到初始状态: swapoff -a swapon -a     例如: [root@wjlcn1026 vm]# f ...

  3. HTML以及DOM选择属性

    http://www.cnblogs.com/season-huang/p/3360869.html

  4. Web访问中的角色与协议

  5. VS2010 rdlc报表无法显示“数据源”选项

  6. [patl1-046]整除光棍

    解题关键:模拟除法 #include<cstdio> #include<cstring> #include<algorithm> #include<cstdl ...

  7. java 矩阵转置算法

    工作中用到了行列转置,把这两种情况的算法记下来,以便后用 1.行列数相等的转置 /** * @description 矩阵转置 * @author oldmonk * @time 2017年8月18日 ...

  8. cocos2d-js 骨骼动画 3.10

    近期使用了cocos动画中的骨骼动画,这里记录使用的两种方式(3.10版): 一.cocos自带的动画编辑器导出的动画 ccs.armatureDataManager.addArmatureFileI ...

  9. javascript使用setTimeout、setInterval时找不到变量的问题

    我们在某个作用域内或者在自己定义的一个类里调用setTimeout.setInterval会经常会遇到找不到某个变量的错误. 比如下面这个例子: window.onload = function(){ ...

  10. GPG入门 - 练习笔记

     GPG入门练习笔记  参考阮一峰的GPG入门教程http://www.ruanyifeng.com/blog/2013/07/gpg.html 1.加密     1)刘言机器: 用王老师公钥加密gp ...