loj #6077. 「2017 山东一轮集训 Day7」逆序对
#6077. 「2017 山东一轮集训 Day7」逆序对
题目描述
给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数。答案对 109+7 10 ^ 9 + 7109+7 取模。
对于一个长度为 n nn 的排列 p pp,其逆序对数即满足 i<j i < ji<j 且 pi>pj p_i > p_jpi>pj 的二元组 (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≤(2n)。
#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」逆序对的更多相关文章
- 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP
[LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...
- 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」逆序对
题目描述: loj 题解: 容斥+生成函数. 考虑加入的第$i$个元素对结果的贡献是$[0,i-1]$,我们可以列出生成函数. 长这样:$(1)*(1+x)*(1+x+x^2)*--*(1+x+x^2 ...
- 「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 的,当且仅当 ...
- loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】
首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj #6073.「2017 山东一轮集训 Day5」距离
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
随机推荐
- 自己写的highcharts级联(点击事件)
$.fn.extend({ Zhu: function (option) { var id = $(this).attr("id"); $('#' + id).highcharts ...
- Spark on yarn的两种模式 yarn-cluster 和 yarn-client
从深层次的含义讲,yarn-cluster和yarn-client模式的区别其实就是Application Master进程的区别,yarn-cluster模式下,driver运行在AM(Applic ...
- Contiki学习笔记
http://blog.chinaunix.net/uid-9112803-id-2975824.html
- 实验吧CTF题库-编程(部分)
百米 3秒提交答案,数字是随机变化的 利用Python脚本解题 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import ...
- 第五章 Java中锁
Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁).在Lock接口出现之前,Java程序 ...
- 配置mysql 问题解决
问题 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--s ...
- JAVA基础知识总结9(特殊类)
1.Object: 所有类的直接或者间接父类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能. 具体 ...
- python笔记--5--文件操作
文件内容操作三部曲:打开.读写.关闭 open(file, mode='r', buffering=1, encoding=None, errors=None, newline=None, close ...
- PHP处理密码的几种方式
在 PHP中,经常会对用户身份进行认证.本文意在讨论对密码的处理,也就是对密码的加密处理. 1.MD5 相信很多PHP开发者在最先接触PHP的时候,处理密码的首选加密函数可能就是MD5了,我当时就是这 ...
- 第3章_Java仿微信全栈高性能后台+移动客户端
当服务器构建完毕并且启动之后,我们通过网页URL地址就可以访问这台服务器,并且服务器会向网页输出Hello Netty这样几个字. Netty有三种线程模型:单线程.多线程.主从线程.Netty官方推 ...