火题小战 B. barbeque
火题小战 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的更多相关文章
- # 火题小战 A.玩个球
火题小战 A.玩个球 题目描述 给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多 ...
- 火题小战 C. 情侣?给我烧了!
火题小战 C. 情侣?给我烧了! 题目描述 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将 ...
- [编程题] 小易喜欢的数列 dp
https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...
- YTU 2960: 改错题--小鼠标,你要干什吗?
2960: 改错题--小鼠标,你要干什吗? 时间限制: 1 Sec 内存限制: 128 MB 提交: 118 解决: 62 题目描述 鼠标双击不同的图标产生不同的效果,比如双击文档(documen ...
- 从乐视和小米“最火电视”之战 看PR传播策略
今年的双11够热闹.一方面,阿里.京东.国美.苏宁等电商巨头卯足了劲儿.试图在双11期间斗个你死我活,剑拔弩张的气势超过了以往不论什么一场双11:还有一方面.不少硬件厂商.家电企业也来凑双11 ...
- 火题大战Vol.1 A.
火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...
- 火题大战Vol.0 B 计数DP
火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...
- 快速入门PaddleOCR,并试用其开发一个搜题小工具
介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...
- H5版俄罗斯方块(4)---火拼对战的雏形
前言: 勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"的人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...
随机推荐
- C# 泛型中的数据类型判定与转换
提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型: 1.常用的值类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float, ...
- Linux下Storm2.1.0的伪分布式安装
官方下载网址:http://storm.apache.org/downloads.html 1.第一步我们先从官网下载解压包 2.然后进行解压 3.配置环境变量 在profile里面插入如下格式语句 ...
- 高效C++:实现
本章主要是解决如下问题: 类的声明和定义在什么时候提出 类与类之间的耦合关系如何降低 类型转换怎么正确使用 尽可能延后变量定义式的出现 变量用到时在定义,不要提前定义,防止变量定义而没有使用的情况,因 ...
- twitch游戏直播(【国外】平台)如何绑定二次验证码_虚拟MFA?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 twitch游戏直播([国外]平台)如何绑定二次验证码_虚拟MFA? 二次验证码小程序于谷歌身份验证器APP的优势(更多见官网 ...
- 面试题十七:打印从1到最大的n位数
输入数字n,按顺序打印到最大的n位数 注意:没有规定类型,无论int或long 都会有可能溢出. 应当选择其他类型如String 方法一:定义长度与位数相同的字符数组,从0开始进行加一操作打印 pub ...
- VMware虚拟机黑屏解决
1.管理员身份运行cmd(右键->以管理员身份运行) 2.修复LSP,输入以下命令然后回车 netsh winsock reset 3.重启电脑即可
- shell变量子串
表达式 说明 ${parameter} 返回变量$parameter的内容 ${#parameter} 返回变量$parameter内容的长度(按字符),也适用于特殊变量 ${parameter:of ...
- Kafka 入门(三)--为什么 Kafka 依赖 ZooKeeper?
一.ZooKeeper 简介 1.基本介绍 ZooKeeper 的官网是:https://zookeeper.apache.org/.在官网上是这么介绍 ZooKeeper 的:ZooKeeper 是 ...
- variable ans might not have been initialized 报错,以及初始化注意点
他是说你没有初始化而已,一般只是个warning,如果是在不能跑,那就给他初始化一下. 注意,初始化可不是任意值哈! 就比如如果要算阶乘,你初始化就不能为0. 还有如果是比较大小这类,就不要把初始化统 ...
- 注册中心Eureka、Zookeeper、Consul的异同点
先上结论: 基于CAP理论介绍: C:Consistency (强一致性)A:Available (可用性)P:Partition tolerance (分区容错性) 最多只能同时较好的满足两个 CA ...