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\) ...
随机推荐
- PATL2-007. 家庭房产-并查集
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- SA读书笔记1
SA的基本任务: 帐户: 为新用户增设帐号,将不再活动的帐号删除,帐号存活期事务(忘记密码等).把用户的主目录放在什么位置.在哪些机器上创建帐号. 硬件:识别并使用新硬件.对于虚拟化:设备可能要安装在 ...
- 【转】Rails 4中使用 Bootstrap 3
转自:http://rvg.me/2013/11/using-bootstrap-3-with-rails-4/ If you are looking to use Bootstrap 3 with ...
- appium_python_android测试环境搭建
第一步 安装appium •Appium是由.NET 开发的,所以,它会依赖 .NET framework相关组件,所以先安装.net framework 4.5,备注: Appium最低支持.ne ...
- java 多线程系列基础篇(九)之interrupt()和线程终止方式
1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解.关于interrupt(),java的djk文档描述如下:http://docs.oracle.c ...
- IRedisClient
事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...
- 部署和调优 3.3 dns安装配置-3
只有一台DNS服务器是不保险的,现在给他配置个从服务器. 在另外一台虚拟机上安装配置DNS服务器.先查看虚拟机ip为:192.168.1.111 ifconfig 给从安装bind和dig命令 yum ...
- C获取当前时间
#include <stdio.h> #include <time.h> #include <string> #include <windows.h> ...
- Spring注解-TaskScheduler
一.定义配置类 import org.springframework.context.annotation.ComponentScan; import org.springframework.cont ...
- mysql存储过程@命名变量的区别
存储过程中@是用来标识每一次运行存储过程都会保存的值.而直接命名是每一次都会初始化的局部变量.@@是用来标识全局变量. CREATE PROCEDURE prc_test ()BEGIN DECLAR ...