题面:

传送门

思路:

首先,一个暴力的想法

对于每一对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);
}

最新文章

  1. Map工具系列-06-销售营改增历史数据处理工具
  2. 设置文本框左边显示的View
  3. APK签名是如何生成的
  4. ThinkPHP_SQL(1)查询语言
  5. 边工作边刷题:70天一遍leetcode: day 74
  6. 《你不知道的JavaScript》第二部分:this 详解
  7. Linux系统root用户忘记密码解决方法
  8. WebX配置文件、启动与响应流程
  9. (使用步骤)ThinkPHP3.1.2中如何配置Ckeditor_4.1.1和Ckfindtor(转)
  10. SqlServer之存储过程
  11. S3C6410 纯粹的裸机启动,自己写的SD BOOT启动
  12. oracle中decode的一些巧妙用法
  13. Socket基础之-启动异步服务侦听
  14. git 服务器搭建及提交代码检查
  15. 中国队再创佳绩,IOI2018喜获四金
  16. verilog中的有符号数理解(转)
  17. 03_java之基本语法
  18. zabbix自定义key监控nginx和fpm(网站并发数)
  19. C语言编译器,写给萌新们看看。
  20. libevent源码深度剖析二

热门文章

  1. Python 之继承
  2. Websocket教程SpringBoot+Maven整合
  3. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素
  4. 适配iOS10和Xcode8
  5. Express中间件简单的实现原理
  6. EventUtil处理js兼容性问题
  7. Ecshop之ajax修改表里的状态(函数化处理)
  8. printf(&quot;\033[1;33m ***** \033[0m \n&quot;);
  9. [Uva623]500!(高精)
  10. 遗传算法 | C++版GA_TSP