题面:

传送门

思路:

首先,一个暴力的想法

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

[ACG001E] BBQ hard [dp]的更多相关文章

  1. agc001E - BBQ Hard(dp 组合数)

    题意 题目链接 Sol 非常妙的一道题目. 首先,我们可以把\(C_{a_i + b_i + a_j + b_j}^{a_i + a_j}\)看做从\((-a_i, -b_i)\)走到\((a_j, ...

  2. AtCoder AGC001E BBQ Hard (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_e 题解: 求\(\sum^n_{i=1}\sum^n_{j=i+1} {A_i+A_j+B ...

  3. [agc001E]BBQ Hard[组合数性质+dp]

    Description 传送门 Solution 题目简化后要求的实际上是$\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}C^{A[i]+A[j]}_{A[i]+A[j]+B[i ...

  4. AGC001 E - BBQ Hard【dp+组合数学】

    首先直接按要求列出式子是\( \sum_{i=1}^{n}\sum_{j=i+1}^{n}C_{a_i+a_j+b_i+b_j}^{a_i+a_j} \) 这样显然过不了,因为ab的数据范围比较小,所 ...

  5. AGC 001E.BBQ Hard(组合 DP)

    题目链接 \(Description\) 给定长为\(n\)的两个数组\(a,b\),求\[\sum_{i=1}^n\sum_{j=i+1}^n\binom{a_i+a_j+b_i+b_j}{a_i+ ...

  6. AT1983-[AGC001E]BBQ Hard【dp,组合数学】

    正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出\(n\)个数对\((a_i,b_i)\) 求 \[\sum_{i=1}^n\sum_{j ...

  7. [Agc001E] BBQ Hard

    [Agc001E] BBQ Hard 题目大意 给定\(n\)对正整数\(a_i,b_i\),求\(\sum_{i=1}^{n-1} \sum_{j=i+1}^n \binom{a_i+b_i+a_j ...

  8. ATcoder 1983 BBQ Hard

    E - BBQ Hard Time limit : 2sec / Memory limit : 256MB Score : 1400 points Problem Statement Snuke is ...

  9. 「AT1983 BBQ Hard」

    呦,来一次久违的BBQ吧! AT题...日本的题库质量一向很高 这题是有关组合数的DP... 前置芝士 快速计算组合数,具体还是自行百度. 膜域下的除法. 具体做法 题目中的问题: \(\sum_{i ...

随机推荐

  1. python_61_装饰器4

    import time def timer(func):#timer(test1) func=test1 def deco(): start_time=time.time() func()#run t ...

  2. CUDA编程时,线程块的处理方法

  3. 安装mysql提示This application requires .NET framework 4.0.

    问题描述:安装MySQL社区版时遇到This application requires .NET framework 4.0. 解决方法:在http://search.microsoft.com/zh ...

  4. IOS ViewTable

    // //  ViewController.swift //  UITableView // //  Created by lanou on 16/11/7. //  Copyright (c) 20 ...

  5. wepy一些问题和解决方案

    wepy一些问题和解决方案 小程序开发和传统的web开发有相识的地方,但是也有不同的地方,要区分. computed属性名和props属性名重复 如果那个组件的渲染值是重名的computed属性,每次 ...

  6. MySQL - GROUP_CONCAT 使用方法

    如上图,我想把结果集中的三行链接成一行,则可这样写:   总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图     ...

  7. spring boot 集成swagger2

    1  在pom.xml中加入Swagger2的依赖 <dependency> <groupId>io.springfox</groupId> <artifac ...

  8. 16.2--Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

    分类: Linux服务篇,Linux架构篇   一.环境需求 本帖针对的是Linux环境,Windows或其他系统也可借鉴.具体只讲述Jenkins配置以及整个流程的实现. 1.JDK(或JRE)及J ...

  9. 背景透明度处理 兼容IE

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. shell与python判断文件是否存在

    日常运维中,我们会存在每日备份的现象,针对这一种情况可能会要求监控文件是否存在.比较笨拙的方法就是登录上服务器到某个路径下查看文件是否存在,除此之外,我们可以利用shell或者python来编写监控文 ...