洛谷题目链接:BBQ Hard

题意翻译

有 n 个数对 \((A_i​; B_i​)\),求出 $$\sum_{i=1}^{n}\sum_{j=i + 1}^{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}$$ 答案对1e9+7取模

  • \(2≦N≦200,000\)
  • \(1≦A_i≦2000,\ 1≦B_i≦2000\)

题解: 考虑\(C_{a_i+b_i}^{b_i}\)的实际意义,实际上它相当于从\((0,0)\)出发,走到\((a_i,b_i)\)的方案数,那么\(C_{a_i+b_i+a_j+b_j}^{a_i+a_j}\)也就相当与从\((0,0)\)出发,走到\((a_i+a_j,b_i+b_j)\)的方案数.

如何统计从\((0,0)\)出发,走到\((a_i+a_j,b_i+b_j)\)的方案数呢?可以用\(f[i][j]\)表示从\((0,0)\)出发,走到\((i,j)\)的方案数,则有\(f[i][j]=f[i-1][j]+f[i][j-1]\)(从左边过来或从下面过来),答案就是\(f[a_i][b_i]\)

考虑将坐标轴平移,将\(C_{a_i+b_i+a_j+b_j}^{a_i+a_j}\)看做从\((-a_i,-b_i)\)走到\((a_j,b_j)\)的方案数.

那么问题来了:为什么不统一从\((0,0)\)出发,而是要将坐标轴平移呢?我们再观察上面的式子,会发现如果统一从\((0,0)\)出发,那么就需要统计\(n^2\)个终点的答案,而在平移坐标轴之后只需要给\(n\)个起点赋初始值,最后统计\(n\)个终点的答案.

但是如果这样计算相当与统计了$$\sum_{i=1}{n}\sum_{j=1}{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}$$

要减去重复的部分,也就是答案相当与:$$\sum_{i=1}^{n}\sum_{j=i + 1}^{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}=\frac{\sum_{i=1}{n}\sum_{j=1}{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}-\sum_{i=1}^n{(a_i+b_i)2 \choose a_i2}}{2}$$

因为从\((-a_i,-b_i)\)到\((a_j,b_j)\)和从\((-a_j,-b_j)\)到\((a_i,b_i)\)的方案是一样的.

因为起点是负数,所以可以给负数加上一个比较大的值使它在数组中下标的位置为正数.

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
const int BASE = 2002;
const int mod = 1e9+7; int n, a[N], b[N], ans = 0, f[BASE*2+5][BASE*2+5], inv[N], fac[N], pinv[N]; void init(){
fac[0] = inv[0] = pinv[0] = fac[1] = inv[1] = pinv[1] = 1;
for(int i = 2; i <= BASE*4; i++){
fac[i] = 1ll*fac[i-1]*i%mod;
inv[i] = 1ll*(mod-mod/i)*inv[mod%i]%mod;
pinv[i] = 1ll*pinv[i-1]*inv[i]%mod;
}
} int C(int n, int m){ return 1ll*fac[n]*pinv[m]%mod*pinv[n-m]%mod; } int main(){
ios::sync_with_stdio(false);
cin >> n, init();
for(int i = 1; i <= n; i++)
cin >> a[i] >> b[i], f[BASE-a[i]][BASE-b[i]]++;
for(int i = 1; i <= BASE*2; i++)
for(int j = 1; j <= BASE*2; j++)
(f[i][j] += (f[i-1][j]+f[i][j-1])%mod) %= mod;
for(int i = 1; i <= n; i++) (ans += f[a[i]+BASE][b[i]+BASE]) %= mod;
for(int i = 1; i <= n; i++) (ans += mod-C((a[i]+b[i])*2, b[i]*2)) %= mod;
ans = 1ll*ans*inv[2]%mod;
cout << ans << endl;
return 0;
}

AT1983 BBQ Hard的更多相关文章

  1. 「AT1983 BBQ Hard」

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

  2. AT1983 BBQ Hard 解题报告

    题意 求\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} \dbinom{a_i+a_j}{a_i+b_i+a_j+b_j}\) 解法 考虑\(\dbinom{a_i+a_j}{a_ ...

  3. AGC001 E - BBQ Hard 组合数学

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

  4. AGC01 A - BBQ Easy

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

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

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

  6. [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 ...

  7. ATcoder 1983 BBQ Hard

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

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

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

  9. [AGC001 E] BBQ Hard

    Description 有\(N(N\leq 200000)\)个数对\((a_i,b_i)(a_i,b_i,\leq 2000)\),求出\(\sum\limits_{i=1}^n\sum\limi ...

随机推荐

  1. “吃神么,买神么”的第一个Sprint计划(第三天)

    “吃神么,买神么”项目Sprint计划 ——5.23  星期六(第三天)立会内容与进度 摘要:今天的立会主要是报告进度以及遇到的困难. 进度:logo正在进行中,其他基本没什么问题.都确定要做出来的大 ...

  2. lintcode-517-丑数

    517-丑数 写一个程序来检测一个整数是不是丑数. 丑数的定义是,只包含质因子 2, 3, 5 的正整数.比如 6, 8 就是丑数,但是 14 不是丑数以为他包含了质因子 7. 注意事项 可以认为 1 ...

  3. 第一个spring冲刺心得及感想

    在这次spring中,学到了不少东西: 1.团队协作精神 2.任务细节化,任务燃尽图 3.身为sm的责任 但是在过程中也认识到了一些不足 1.对于团队协作完成一个大的项目还是不熟悉 2.个人能力的不足 ...

  4. ACM数论之旅5---数论四大定理(你怕不怕(☆゚∀゚)老实告诉我)

    (本篇无证明,想要证明的去找度娘)o(*≧▽≦)ツ ----------数论四大定理--------- 数论四大定理: 1.威尔逊定理 2.欧拉定理 3.孙子定理(中国剩余定理) 4.费马小定理 (提 ...

  5. 【Linux笔记】ldconfig、ldd

    一.ldconfig ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/ ...

  6. C++模式学习------代理模式

    Proxy代理模式 : 为其他对象提供一种代理以控制对这个对象的访问.代理类作为桥梁是请求方和执行方的中间者,将请求方和真正的执行方分割开来,也是两者之间调用的协调者.例如执行类也就是被代理类,可以在 ...

  7. 用join取代not in

    写了好几个页面,速度都上不去,瓶颈在于SQL查询.太多的表,太多的not in,总是从一大推表和数据中筛选出一点数据.看了很多关于SQL优化的文章,都强烈要求不要太多使用not in查询,最好用表连接 ...

  8. matplotlib + pandas绘图

    利用pandas处理日期数据,并根据日期绘制增长率曲线. 处理的json文本内容如下: # pd.json [{"name": "A", "date& ...

  9. STL 算法中函数对象和谓词

    STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...

  10. oracle 存储过程创建报错 Procedure created with compilation errors

    出现这错误的话,存储过程还是会成功创建的,创建好后再逐个打开查找存储过程的问题 问题:基本上就是存储过程里面的表不存在,dblink 不存在    ,用户名.xx表  要么用户名不存在要么表不存在 创 ...