#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. [置顶] C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...

  2. Solaris10技巧

    如何查看UFS文件系统创建命令 root@ofs0accmcc01 # mkfs -m /dev/md/rdsk/d100 mkfs -F ufs -o nsect=128,ntrack=48,bsi ...

  3. jackson 进行json与java对象转换 之四

    jackson简单使用,对象转json,json转对象,json转list   POJO序列化为json字符串: 准备一个POJO: @JsonIgnoreProperties(ignoreUnkno ...

  4. xcode减小静态库的大小(转)

    减小静态库的大小 编译生成的.a文件太大,但又没有冗余的文件可以删除已减少体积,找了很久才找到解决办法,如下: Build Settings-->Generate Debug Symbols 将 ...

  5. 第二天:tomcat体系结构和第一个Servlet

    1.  打war包 2.  Tomcat体系再说明:   问题:如何去配置默认主机???    3.tomcat和servlet在网络中的位置 4.    servlet快速入门案例   1).开发s ...

  6. re.findall(?: ) ?:取消优先获取组的权限

  7. for xml path 按分类合并行数据

    ) as itemnum FROM ( SELECT Sonum, (SELECT ItemNum+',' FROM testtb    WHERE Sonum=A.Sonum    FOR XML  ...

  8. [codeforces126B]Password

    解题关键:KMP算法中NEXT数组的理解. #include<bits/stdc++.h> #define maxn 1000006 using namespace std; typede ...

  9. MyBatis配置Setting详细说明

    该表格转载自http://blog.csdn.net/summer_yuxia/article/details/53169227 setting是指定MyBatis的一些全局配置属性,这是MyBati ...

  10. Spring IOC容器解析及实现原理

    最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助sprin ...