[ACG001E] BBQ hard [dp]
2024-08-28 22:22:46
题面:
思路:
首先,一个暴力的想法
对于每一对pack,求出f(ai+aj,bi+bj),其中f(x,y)=(x+y)!/(x!y!),也就是x个a,y个b的排列方式个数
然后转化模型,将f数组变化成这样的形式:f(x,y)表示一个x行y列的方格图,左下走到右上的方法数
然后将所有的f放到一个图中,就变成了:左下的n个点(-ai,-bi)到右上的n个点(ai,bi)的总方法数(任意一个出发任意一个到达)
用DAGdp把这个方法数求出来,就是sigma(f(ai+aj,bi+bj))(i=1...n,j=1...n),减去所有的f(ai+ai,bi+bi)再除以二即可
注意:MOD1e9+7意义下,要使用乘法逆元
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define MOD 1000000007
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
const int dx[]={,,},dy[]={,,};
ll dp[][];int N=;bool vis[][];
int n,xx[],yy[],qx[],qy[],head=,tail=,maxq=;
ll inv[],finv[],f[];
void init(){
int i;inv[]=finv[]=;
for(i=;i<=;i++){
inv[i]=((MOD-MOD/i)*inv[MOD%i])%MOD;
}
f[]=;
for(i=;i<=;i++){
f[i]=(f[i-]*i)%MOD;
finv[i]=(finv[i-]*inv[i])%MOD;
}
}
int main(){
init();
int i,maxx=,maxy=,x,y,tx,ty;ll X=;
n=read();
for(i=;i<=n;i++){
xx[i]=read();yy[i]=read();
dp[N-xx[i]][N-yy[i]]+=;
maxx=max(maxx,xx[i]);maxy=max(maxy,yy[i]);
}
qx[]=N-maxx,qy[]=N-maxy;vis[N-maxx][N-maxy]=;
while(head!=tail){
x=qx[head];y=qy[head];head=(head+)%maxq;
// cout<<"dp "<<x<<ends<<y<<ends<<dp[x][y]<<endl;;
for(i=;i<=;i++){
tx=x+dx[i];ty=y+dy[i];
if(tx>N+maxx||ty>N+maxy) continue;
dp[tx][ty]=(dp[tx][ty]+dp[x][y])%MOD;
// cout<<" to "<<tx<<ends<<ty<<ends<<dp[tx][ty]<<endl;
if(!vis[tx][ty]){
vis[tx][ty]=;
qx[tail]=tx;qy[tail]=ty;tail=(tail+)%maxq;
}
}
}
for(i=;i<=n;i++){
X=X+dp[N+xx[i]][N+yy[i]];X%=MOD;
X=X-((f[xx[i]*+yy[i]*]*finv[xx[i]*])%MOD*finv[yy[i]*])%MOD+MOD;
X%=MOD;
}
printf("%lld\n",(X*inv[])%MOD);
}
最新文章
- Map工具系列-06-销售营改增历史数据处理工具
- 设置文本框左边显示的View
- APK签名是如何生成的
- ThinkPHP_SQL(1)查询语言
- 边工作边刷题:70天一遍leetcode: day 74
- 《你不知道的JavaScript》第二部分:this 详解
- Linux系统root用户忘记密码解决方法
- WebX配置文件、启动与响应流程
- (使用步骤)ThinkPHP3.1.2中如何配置Ckeditor_4.1.1和Ckfindtor(转)
- SqlServer之存储过程
- S3C6410 纯粹的裸机启动,自己写的SD BOOT启动
- oracle中decode的一些巧妙用法
- Socket基础之-启动异步服务侦听
- git 服务器搭建及提交代码检查
- 中国队再创佳绩,IOI2018喜获四金
- verilog中的有符号数理解(转)
- 03_java之基本语法
- zabbix自定义key监控nginx和fpm(网站并发数)
- C语言编译器,写给萌新们看看。
- libevent源码深度剖析二
热门文章
- Python 之继承
- Websocket教程SpringBoot+Maven整合
- 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素
- 适配iOS10和Xcode8
- Express中间件简单的实现原理
- EventUtil处理js兼容性问题
- Ecshop之ajax修改表里的状态(函数化处理)
- printf(";\033[1;33m ***** \033[0m \n";);
- [Uva623]500!(高精)
- 遗传算法 | C++版GA_TSP