LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
来源:互联网 发布:口腔医学专升本知乎 编辑:程序博客网 时间:2024/05/29 18:59
这题(BZOJ2431的加强版)厉害了。。。
考虑从小到大加入数,则i就可以让逆序对数+[0,i-1]
问题就变为了现在有一个不定方程:x1+..+xn=m,且0<=xi<=i-1
考虑用容斥,于是要计算F(i,j)表示[1,n]选i个数和为j的方案数
则最终答案为sum{(F(0,j)-F(1,j)+F(2,j)-...)*(和为m-j有n个变量的不定方程解的个数)}(j=0..m)
如何计算F(i,j)呢?一个显然的方法是类似背包的DP,不过这题目有点特殊。可以假设你现在有一个序列,你每次可以选择把序列整体+若干1,然后再添一个1,然后再+若干1。由于可能会加到大于n,把这部分减掉就好了.
这样最多只能弄大概450次,于是复杂度就是O(450*m)
#include<bits/stdc++.h>#define mod 1000000007#define maxn 100100using namespace std;int lim,n,m,ans,f[456][maxn],fac[maxn<<1],inv[maxn<<1];int qpow(int a,int b){int ans=1,tmp=a;for(;b;b>>=1,tmp=1ll*tmp*tmp%mod)if(b&1)ans=1ll*ans*tmp%mod;return ans;}int C(int x,int y){if(x>y)return 0;return 1ll*fac[y]*inv[x]%mod*inv[y-x]%mod;}int main(){scanf("%d%d",&n,&m);fac[0]=inv[0]=1;for(int i=1;i<=n+m;++i)fac[i]=1ll*fac[i-1]*i%mod;inv[n+m]=qpow(fac[n+m],mod-2);for(int i=n+m-1;i>=1;--i)inv[i]=1ll*inv[i+1]*(i+1)%mod;lim=sqrt(2*m)+3;f[0][0]=1;for(int i=1;i<=lim;++i)for(int j=0;j<=m;++j){if(j>=i)f[i][j]=(f[i][j-i]+f[i-1][j-i])%mod;if(j>=n+1)f[i][j]=(f[i][j]-f[i-1][j-n-1])%mod;}for(int i=0;i<=m;++i){int pans=0;for(int j=0;j<=lim;++j)if(j&1)pans=(pans-f[j][i])%mod;else pans=(pans+f[j][i])%mod;ans=(ans+1ll*pans*C(n-1,n+m-i-1))%mod;if(ans<0)ans+=mod;}printf("%d",ans);}
阅读全文
0 0
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对
- [费用流]LOJ#6079. 「2017 山东一轮集训 Day7」养猫
- [霍尔定理]「2017 山东一轮集训 Day2」LOJ 6062——PAIR
- [倍增NTT][DP] LOJ#6059. 「2017 山东一轮集训 Day1」Sum
- [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘
- [最短路 杂题] LOJ#6075. 「2017 山东一轮集训 Day6」重建
- [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列
- [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串
- [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因
- loj #6062. 「2017 山东一轮集训 Day2」Pair(线段树)
- [LOJ#6060][线性基]2017 山东一轮集训 Day1. Set
- [DP][倍增NTT]LOJ#6059. 2017 山东一轮集训 Day1. Sum
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [计数][容斥] LOJ#6065 || BZOJ4927 && 2017 山东一轮集训 Day3. 第一题
- LOJ 6041 「雅礼集训 2017 Day7」事情的相似度
- LOJ 6043 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
- HDU5692:Snacks(DFS序 & 线段树区间更新)
- 计算机网络 --应用层
- 通过浏览器获得百度云盘大文件真实下载地址
- POJ 1905 Expanding Rods(二分)
- mapreduce web日志预处理
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- 202. Happy Number
- 73前序遍历和中序遍历树构造二叉树
- string实现C++
- 自己封装一个类借助实现数据库加载及夜间模式
- matlab之simulink学习(1、搭建一个简单系统)
- 一个fork的面试题
- java生成PDF文件
- tomcat webapps 目录下web工程只有目录,没有class文件