bzoj 3622: 已经没有什么好害怕的了 (容斥原理+DP)
2017-03-23 16:46
344 查看
题目描述
传送门
题目大意:两个长度为n的数组中的数两两配对。使满足a>b的对数恰好比满足a题解
将a,b都排序f[i][j]表示匹配到第i个,满足a>b的配对个数为j的方案数。
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define N 2003 #define p 1000000009 #define LL long long using namespace std; int n,k; LL f ,jc ,inv ; int a ,b ,pos ; LL calc(int n,int m) { return jc *inv[m]%p*inv[n-m]%p; } LL quickpow(LL num,int x) { LL ans=1; LL base=num%p; while (x) { if (x&1) ans=ans*base%p; x>>=1; base=base*base%p; } return ans; } int main() { freopen("a.in","r",stdin); freopen("my.out","w",stdout); scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) scanf("%d",&b[i]); jc[0]=1; for (int i=1;i<=n;i++) jc[i]=jc[i-1]*i%p; for (int i=0;i<=n;i++) inv[i]=quickpow(jc[i],p-2)%p; sort(a+1,a+n+1); sort(b+1,b+n+1); int l=1; for (int i=1;i<=n;i++) { while (b[l]<a[i]&&l<=n) l++; pos[i]=l-1; } f[0][0]=1; for (int i=1;i<=n;i++) for (int j=0;j<=n;j++) { f[i][j]=f[i-1][j]; if (j-1>=0) f[i][j]=(f[i][j]+(LL)f[i-1][j-1]*((pos[i]-j+1)>0?pos[i]-j+1:0)%p)%p; } LL ans=0; if ((n+k)&1) { printf("0\n"); return 0; }else k=(n+k)/2; for (int i=k;i<=n;i++){ int t=i-k,opt; if (t&1) opt=-1; else opt=1; ans=(ans+opt*calc(i,k)*f [i]%p*jc[n-i]%p)%p; } printf("%lld\n",(ans%p+p)%p); }
相关文章推荐
- [BZOJ3622]已经没有什么好害怕的了(容斥原理+DP)
- ●BZOJ 3622 已经没有什么好害怕的了
- BZOJ3622: 已经没有什么好害怕的了
- 【BZOJ3622】已经没有什么好害怕的了,DP+容斥原理
- bzoj 3622: 已经没有什么好害怕的了
- [BZOJ 3622]已经没有什么好害怕的了
- 【BZOJ3622】已经没有什么好害怕的了 动态规划+容斥原理
- BZOJ3622 已经没有什么好害怕的了(动态规划+容斥原理)
- [BZOJ3622]已经没有什么好害怕的了-容斥原理-二项式反演
- BZOJ 3622 已经没有什么好害怕的了
- BZOJ3622: 已经没有什么好害怕的了 解题报告
- [BZOJ 3622]已经没有什么好害怕的了
- 【BZOJ3622】已经没有什么好害怕的了(DP,二项式反演)
- 【BZOJ3622】已经没有什么好害怕的了【计数DP】【姿势】
- bzoj3622 已经没有什么好害怕的了(容斥原理+DP+二项式反演)
- BZOJ 3622 已经没有什么好害怕的了 动态规划+容斥原理
- Bzoj3622 已经没有什么好害怕的了
- bzoj 3622: 已经没有什么好害怕的了 dp+容斥
- bzoj 3622: 已经没有什么好害怕的了
- bzoj 3622 已经没有什么好害怕的了