博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)
阅读量:6519 次
发布时间:2019-06-24

本文共 1636 字,大约阅读时间需要 5 分钟。

Description

图片略

Solution

对啊,已经没有什么好害怕的了

没有头的麻美学姐还是很萌的(雾

排序预处理p[i]为b中小于a[i]的最大的数的标号

f[i][j]表示前i个糖果使得糖果大于药片的至少有j组

则f[i][j]=f[i-1][j]+f[i-1][j-1]*(p[i]-j+1)

容斥得g[j]=f[n][j]*(n-j)!-∑g[k]*C(j,k) (j+1<=k<=n)

(Update:今天发现这个好像是广义容斥原理?)

#include
#include
#include
#include
#include
#define MAXN 2002#define Mod 1000000009typedef long long LL;using namespace std;int n,k,a[MAXN],b[MAXN],p[MAXN];LL f[MAXN][MAXN],c[MAXN][MAXN],g[MAXN];int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0';c=getchar(); } return x*f;}int main(){ n=read(),k=read(); if((n+k)%2) {printf("0");return 0;} k=(n+k)/2; for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); sort(a+1,a+1+n); sort(b+1,b+1+n); int t=1; for(int i=1;i<=n;i++) { while(a[i]>b[t]&&t<=n)t++; p[i]=t-1; } f[0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=i;j++) { if(j)f[i][j]=(f[i-1][j-1]*max(0,p[i]-j+1))%Mod; f[i][j]=(f[i][j]+f[i-1][j])%Mod; } c[1][0]=1;c[1][1]=1; for(int i=2;i<=n;i++) for(int j=0;j<=i;j++) {
if(!j)c[i][j]=1;c[i][j]=(c[i-1][j-1]+c[i-1][j])%Mod;} for(int i=n;i>=k;i--) { g[i]=f[n][i]; for(int j=1;j<=n-i;j++) g[i]=(g[i]*j)%Mod; for(int j=i+1;j<=n;j++) { g[i]=(g[i]-(g[j]*c[j][i])%Mod+Mod)%Mod; } } printf("%d",g[k]); return 0;}

 

转载于:https://www.cnblogs.com/Zars19/p/6706723.html

你可能感兴趣的文章
C#与PHP通信压缩
查看>>
关于 Linux
查看>>
ios开发之导航控制器的原理
查看>>
《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
查看>>
Linux系统_Centos7下安装Nginx
查看>>
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
进制转换
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
程序猿知道英语词汇
查看>>
数据存储(两)--SAX发动机XML记忆(附Demo)
查看>>
深入分析面向对象中的封装作用
查看>>
深刻理解Python中的元类(metaclass)
查看>>
Android View体系(六)从源码解析Activity的构成
查看>>
fnmatch源码阅读
查看>>