Description

有\(N(N\leq 200000)\)个数对\((a_i,b_i)(a_i,b_i,\leq 2000)\),求出\(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^nC_{a_i+b_i+a_j+b_j}^{a_i+a_j}\) 答案对\(10^9+7\)取模

Solution

首先考虑\(C(n,m)\)的组合意义:在笛卡尔坐标系下只能向上和向右走,从原点走到\((m,n-m)\)的路径总数。

所以这个\(C_{a_i+b_i+a_j+b_j}^{a_i+a_j}\)就可以看成从\((0,0)\)走到\((a_i+a_j,b_i+b_j)\)的方案数,这个式子里有\(i\)的项和有\(j\)的项掺在了一起,尝试将他们拆开。这个方案数等价于从\((-a_i,-b_i)\)走到\((a_j,b_j)\)的方案数,这样一来\(i\)和\(j\)至少分开了。

然后试着不考虑\(j>i\)的限制,求出第三象限上所有点到\((a_i,b_i)\)的方案数,再减去从\((-a_i,-b_i)\)到\((a_i,b_i)\)的方案数,再除以\(2\)就是就是最终的答案了。

可以设\(f[i][j]\)表示第三象限内的点只能向上和向右走,走到\((i,j)\)的方案数。初值是\(f[a_i][b_i]=1\),转移就是每个点可以从它的左边或者右边走过来\(f[i][j]+=f[i-1][j]+f[i][j-1]\)。

Code

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::min;
using std::max;
using std::swap;
using std::vector;
const int M=2005;
const int N=200005;
const int ZYZ=1e9+7;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B) int n,a[N],b[N];
int f[M<<1][M<<1];
int fac[M<<2],ifac[M<<2]; int getint(){
int X=0,w=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} int ksm(int a,int b,int ans=1){
while(b){
if(b&1) ans=1ll*ans*a%ZYZ;
a=1ll*a*a%ZYZ;b>>=1;
}return ans;
} void init(int n){
fac[0]=ifac[0]=1;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%ZYZ;
ifac[n]=ksm(fac[n],ZYZ-2);
for(int i=n-1;i;i--) ifac[i]=1ll*ifac[i+1]*(i+1)%ZYZ;
} int C(int n,int m){
return 1ll*fac[n]*ifac[m]%ZYZ*ifac[n-m]%ZYZ;
} signed main(){
init(8000);
n=getint();
for(int i=1;i<=n;i++){
a[i]=getint(),b[i]=getint();
f[2001-a[i]][2001-b[i]]++;
}
for(int i=1;i<=4001;i++)
for(int j=1;j<=4001;j++)
f[i][j]=(1ll*f[i][j]+f[i-1][j]+f[i][j-1])%ZYZ;
int ans=0;
for(int i=1;i<=n;i++) ans=(ans+f[a[i]+2001][b[i]+2001])%ZYZ;
for(int i=1;i<=n;i++) ans=(ans-C(a[i]+b[i]<<1,b[i]<<1)+ZYZ)%ZYZ;
printf("%lld\n",1ll*ans*ksm(2,ZYZ-2)%ZYZ);
return 0;
}

[AGC001 E] BBQ Hard的更多相关文章

  1. AGC001 E - BBQ Hard 组合数学

    题目链接 AGC001 E - BBQ Hard 题解 考虑\(C(n+m,n)\)的组合意义 从\((0,0)\)走到\((n,m)\)的方案数 从\((x,y)\)走到\((x+n,y+m)\)的 ...

  2. 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的数据范围比较小,所 ...

  3. AGC001 E - BBQ Hard [组合数]

    这题就是要求 \(\sum_{i=1}^{n} \sum_{j=i+1}^{n} C(a_i+a_j+b_i+b_j,a_i+a_j)\) 考虑搞一搞,\(C(a_i+a_j+b_i+b_j,a_i+ ...

  4. 【AtCoder】AGC001

    AGC001 A - BBQ Easy 从第\(2n - 1\)个隔一个加一下加到1即可 #include <bits/stdc++.h> #define fi first #define ...

  5. A*G#C001

    AGC001 A BBQ Easy 贪心. https://agc001.contest.atcoder.jp/submissions/7856034 B Mysterious Light 很nb这个 ...

  6. 【AGC板刷记录】

    这个帖子,是在自己学知识点累了的时候就看看\(AGC\)的题目来休息. 而且白天上课可以做( AGC-001 \(A\ BBQ Easy\) 考虑从小到大排,相邻两个取为一对. BBQ Easy #i ...

  7. AGC001[BCDE] 题解

    A没意思 F太难 所以大概近期的AGC题解都是BCDE的 然后特殊情况再说 开始刷AGC的原因就是计数太差 没有脑子 好几个学长都推荐的AGC所以就开始刷了 = = 大概两天三篇的速度?[可能也就最开 ...

  8. AGC01 A - BBQ Easy

    目录 题目链接 题解 代码 题目链接 AGC01 A - BBQ Easy 题解 贪心 排序之后从大到小,没两组取小的那个 代码 #include<cstdio> #include< ...

  9. 【agc001e】BBQ HARD(动态规划)

    [agc001e]BBQ HARD(动态规划) 题面 atcoder 洛谷 题解 这些agc都是写的整场的题解,现在还是把其中一些题目单独拿出来发 这题可以说非常妙了. 我们可以把这个值看做在网格图上 ...

随机推荐

  1. Array of Doubled Pairs LT954

    Given an array of integers A with even length, return true if and only if it is possible to reorder ...

  2. SpringBoot2.x配置JsonRedisSerializer

    @Configurationpublic class SpringCacheRedisConfig { @Bean public RedisCacheManager cacheManager(Redi ...

  3. mark 三年工作总结

    在新公司加班,正在看<HBase 权威指南>,看Michael Stack为本书写的序,介绍HBase最初的发展,Lars在HBase 使用和推广做出的贡献. 突然想到,我还有一篇工作三年 ...

  4. C语言编程常见技巧(问题???)

    本文章根据<算法竞赛入门经典(第二版)>一书整理... 第一章 程序设计入门 printf 语句控制输出小数位数或总长度 printf("%.3f\n",8.0/5.0 ...

  5. Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response

    问题分析: 在ServletRequest servletRequest中已经存在一个项目名称,此时,又用项目名称访问 http://localhost:8080/rent/pdf/preview r ...

  6. springmvc 对日期的转换与处理

    一,背景 近期项目上需求还没有确定,难道清闲,对项目中不合理的地方进行一些升级改造.鉴于项目使用的技术框架比较老旧(spring 3.0+) ,一直没有对此做大的升级改造.由于之前项目入参,出参都是使 ...

  7. 08-jQuery的位置信息

    Query的位置信息跟JS的client系列.offset系列.scroll系列封装好的一些简便api. 一.宽度和高度 获取宽度 .width() 描述:为匹配的元素集合中获取第一个元素的当前计算宽 ...

  8. Beta冲刺 (3/7)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件 编辑文 ...

  9. Linux 线程编程1.0

    在编译多线程程序的时候,需要连接libpthread文件: gcc pthread.c  -o  pthread  -lpthread: 所有线程一律平等,没有父子关系,线程属于进程. 创建线程用 p ...

  10. RxSwift学习笔记9:amb/tabkeWhile/tabkeUntil/skipWhile/skipUntil

    //amb基本介绍 //当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素. //并忽略掉其他的 Observable ...