火题小战 B. barbeque

题目描述

\(Robbery\) 是一个大吃货(雾)

某个神奇的串由牛肉和青椒构成,于是\(Robbery\)购买了\(n\)个餐包来自己做这个串,每个餐包中有一些牛肉,青椒和一些特殊的调料(我们认为所有的牛肉和青椒都是一样的,但是调料各不相同)

当拿出所有的餐包后,\(Robbery\)突然想到一个问题,假如将所有餐包两两组合,将选中的两个餐包中的所有牛肉和青椒串在一起,能够组合出多少串的方法

(请参考图片以理解样例)

输入格式

第一行为整数\(n\)

接下来\(n\)行每行两个整数\(a_i\)和\(b\) 表示第\(i\)个餐包中有\(a_i\)块牛肉,\(b_i\)块青椒

输出格式

输出一个整数表示串的总方案数,最终结果对\(1e9+7\)取模

样例

样例输入

3

1 1

1 1

2 1

样例输出

26

数据范围与提示

对于\(30\%\)的数据,保证\(n \leq 5000\)

对于另外\(30\%\)的数据,保证\(n\leq 1e5,a_i,b_i \leq 100\)

对于所有数据,保证\(2 \leq n \leq 2e5,1 \leq a_i,b_i \leq 2000\)

分析

这一道题的暴力是比较好打的,我们两两枚举 \(i,j\) ,每次计算 \(C_{a[i]+a[j]+b[i]+b[j]}^{a[i]+a[j]}\) 将价值累加即可

我们会发现,暴力的算法总会枚举 \(i\) 和 \(j\),这样的效率肯定是 \(n^2\) 的

于是,我们考虑组合数的几何意义

我们可以把 \(C_{n+m}^{n}\) 看成从原点出发,只能向上或者向右走,到达坐标为 \((n,m)\) 的点的方案数

因此上面的式子可以理解到达坐标为 \((a[i]+a[j],b[i]+b[j])\) 的点的方案数

我们将原点和目标点向左下方平移,即同时减去 \((a[i],b[i])\)

这样出发点就变成了 \((-a[i],-b[i])\) ,终点就变成了 \((a[j],b[j])\)

这样就不用分别枚举 \(i\) 和 \(j\)

此时我们设 \(f[i][j]\) 为 \(n\) 个点走到 \((i,j)\) 的方案数之和

初始时我们要把 \(f[-a[i]][-b[i]]\) 加一

转移时,根据组合数的性质,有 \(f[i][j]+=f[i-1][j]+f[i][j-1]\)

最后统计答案时,我们要把自己到自己的贡献减去,还要把起点终点互换的情况减去

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+101;
const int mod=1e9+7;
int n,m,a[maxn*100],b[maxn*100],ny[maxn*4],jc[maxn*4],jcc[maxn*4],f[maxn*2][maxn*2],s=2050;
long long getC(int n,int m){
return (long long)jc[n]%mod*jcc[n-m]%mod*jcc[m]%mod;
}
int main(){
scanf("%d",&n);
ny[1]=1;
for(int i=2;i<maxn*4;i++){
ny[i]=(long long)((long long)mod-mod/i)*ny[mod%i]%mod;
}
jc[0]=jcc[0]=1;
for(int i=1;i<maxn*4;i++){
jc[i]=(long long)jc[i-1]*i%mod;
jcc[i]=(long long)jcc[i-1]*ny[i]%mod;
}
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
f[s-a[i]][s-b[i]]++;
}
for(int i=1;i<2*maxn-5;i++){
for(int j=1;j<2*maxn-5;j++){
f[i][j]=(long long)((long long)f[i][j]%mod+(long long)f[i-1][j]%mod+(long long)f[i][j-1]%mod)%mod;
}
}
long long ans=0;
for(int i=1;i<=n;i++){
ans=(ans+(long long)f[s+a[i]][s+b[i]])%mod;
ans=(ans-getC(2*a[i]+2*b[i],2*a[i]))%mod;
ans=(ans+mod)%mod;
}
printf("%lld\n",(long long)ans*ny[2]%mod);
return 0;
}

火题小战 B. barbeque的更多相关文章

  1. # 火题小战 A.玩个球

    火题小战 A.玩个球 题目描述 给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多 ...

  2. 火题小战 C. 情侣?给我烧了!

    火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...

  3. [编程题] 小易喜欢的数列 dp

    https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...

  4. YTU 2960: 改错题--小鼠标,你要干什吗?

    2960: 改错题--小鼠标,你要干什吗? 时间限制: 1 Sec  内存限制: 128 MB 提交: 118  解决: 62 题目描述 鼠标双击不同的图标产生不同的效果,比如双击文档(documen ...

  5. 从乐视和小米“最火电视”之战 看PR传播策略

        今年的双11够热闹.一方面,阿里.京东.国美.苏宁等电商巨头卯足了劲儿.试图在双11期间斗个你死我活,剑拔弩张的气势超过了以往不论什么一场双11:还有一方面.不少硬件厂商.家电企业也来凑双11 ...

  6. 火题大战Vol.1 A.

    火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...

  7. 火题大战Vol.0 B 计数DP

    火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...

  8. 快速入门PaddleOCR,并试用其开发一个搜题小工具

    介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...

  9. H5版俄罗斯方块(4)---火拼对战的雏形

    前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...

随机推荐

  1. InceptionV4

    目录 1. inception v4 2. Inception-resnet-v1 & Inception-resnet-v2 2.1 Inception-resnet-v1的组成模块 2.2 ...

  2. [jvm] -- 垃圾收集器篇

    垃圾收集器 Serial 收集器 单线程收集器,不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The ...

  3. 题解 洛谷 P5385 【[Cnoi2019]须臾幻境】

    首先我们知道 \(n\) 个点的树有 \(n-1\) 条边,因此对于森林来说,其点数减边数即为树的个数.那么对于普通的图,求出其任意一个生成树森林,森林中树的个数即为原图中连通块的个数,也就是点数减边 ...

  4. 5G UE能力-UE capability information解析(ENDC)

    本文主要以EN-DC(双连接),mmw(毫米波)的接入过程中的为例,其他以此类推,整理不易,望多推荐 第一次UE能力问询 第一次能力问询主要是基站向UE问询4G和3G能力 第一次UE能力上报 第一次U ...

  5. mysql字符集 utf8 和utf8mb4 的区别

    一.导读我们新建mysql数据库的时候,需要指定数据库的字符集,一般我们都是选择utf8这个字符集,但是还会又一个utf8mb4这个字符集,好像和utf8有联系,今天就来解析一下这两者的区别. 二.起 ...

  6. 容器centos7安装部署ansible

    容器centos7安装部署ansible centos镜像版本及ansible版本 centos:centos7.5.1804 ansible:2.9.11 启动容器并进入容器 docker run ...

  7. 【JMicro】微服务部署example.provider应用

    JMicro是一个用Java语言实现的开源微服务全家桶, 源码地址:https://github.com/mynewworldyyl/jmicro, Demo地址:http://124.70.152. ...

  8. MySQL(8.0.19版本的下载和安装)、window10

      mysql的下载 MySQL官网:https://www.mysql.com/ 下载地址:https://dev.mysql.com/downloads/installer/ MySQL 8.0参 ...

  9. linux下使用vscode和makefile搭建C++开发环境

    最近在linux上跑一些开源库做学习用, 顺手就搭了一下vscode的c++开发环境, 这里分享一下vscode进行C++开发的基本环境结构. 1. 首先是编辑器, vscode直接官网下载的, 后期 ...

  10. samba服务及配置

    samba 目录 samba 1. samba简介 2. samba访问 配置示例 3.搭建用户认证共享服务器 4.搭建匿名用户共享服务器 1. samba简介 Samba是在Linux和UNIX系统 ...