火题小战 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的算法探索后, 让我们来尝试一下人机大战雏形编写. 本系列的文章链 ...
随机推荐
- tensorflow对鸢尾花进行分类——人工智能入门篇
tensorflow之对鸢尾花进行分类 任务目标 对鸢尾花数据集分析 建立鸢尾花的模型 利用模型预测鸢尾花的类别 环境搭建 pycharm编辑器搭建python3.* 第三方库 tensorflow1 ...
- go : 连接数据库并插入数据
package main import ( "database/sql" "fmt" "log" "net/http" ...
- 谷歌浏览器扩展 crx 下载
下方服务可让国内成功下载谷歌浏览器.crx 扩展,如谷歌浏览器无法安装,可以使用终极解决方法,把.crx 解压缩,然后在扩展中心中开启 开发者模式然后选择加载已解压的扩展程序. 需要注意的是解压缩的文 ...
- 题解 洛谷 P3734 【[HAOI2017]方案数】
可以先考虑没有障碍物的情况,设计状态\(f_{i,j,k}\),表示到达坐标 \((x,y,z)\)二进制下,\(x\)有\(i\)位,\(y\)有\(j\)位,\(z\)有\(k\)位的方案数. 得 ...
- xilinx fpga 生成3*3窗口
在写滤波程序的时候在网上看了好几篇大佬的笔记,都有提到使用3*3窗口,由于小白一个,看到复杂的理论就惧怕的不行.但是现在不得不上,自己调用移位寄存器ip核然后做了个3*3窗口出来,自己动手作出来忽然感 ...
- Oracle创建自动增长列
前言: Oracle中不像SQL Server在创建表的时候使用identity(1001,1)来创建自动增长列,而是需要结合序列(Sequences)和触发器(Triggers)来实现 创建测试表 ...
- Arrays.sort() ----- TimSort
Arrays.sort() Arrays.sort()对于基本类型使用的是DualPivotQuicksort双轴快速排序,而对于非基本类型使用的是TimSort,一种源自合并排序和插入排序的混合稳定 ...
- 社交网站的数据挖掘与分析pdf版本|网盘下载地址附提取码|
点击此处进入网盘下载地址 提取码:btqx 作者介绍: 马修·罗塞尔(MatthewA.Russell),DigitalReasoningSystems公司的技术副总裁和Zaffra公司的负责人,是热 ...
- pandas_使用透视表与交叉表查看业绩汇总数据
# 使用透视表与交叉表查看业绩汇总数据 import pandas as pd import numpy as np import copy # 设置列对齐 pd.set_option("d ...
- 5分钟白嫖我常用的免费效率软件/工具!效率300% up!
Mac 免费效率软件/工具推荐 1. uTools(Windows/Mac) 还在为了翻译 English 而专门下载一个翻译软件吗? 还在为了格式某个 json 文本.时间戳转换而打开网址百度地址吗 ...