AGC 001E.BBQ Hard(组合 DP)
\(Description\)
给定长为\(n\)的两个数组\(a,b\),求$$\sum_{i=1}n\sum_{j=i+1}n\binom{a_i+a_j+b_i+b_j}{a_i+a_j}\ mod\ 10^9+7$$
\(n\leq2\times10^5,a_i,b_i\leq2000\)。
\(Solution\)
考虑\(\binom{n+m}{n}\)的组合意义:在网格图上从\((0,0)\)走到\((n,m)\)的方案数(NE lattice paths)。也等于从\((x,y)\)走到\((x+n,y+m)\)的方案数。
考虑\(\binom{a_i+a_j+b_i+b_j}{a_i+a_j}\)的组合意义:从\((0,0)\)走到\((a_i+a_j+b_i+b_j)\)的方案数,从\((-a_i,-b_i)\)走到\((a_j,b_j)\)的方案数。
考虑计算从任意\((-a_i,-b_i)\)走到任意\((a_j,b_j)\)的方案数。从某个点走到另一个点的方案数可以递推得到。从某些点走到某个点的方案数同样可以递推。
算完后减去每个点自己到自己的方案数,再把答案除以\(2\)就行了。
复杂度\(O((2\max(a_i,b_i))^2)\)。
//127ms 64384KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
typedef long long LL;
const int N=2e5+5,M=4005,D=2001;
int A[N],B[N],f[M][M],fac[N],ifac[N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
}
#define C(n,m) 1ll*fac[n]*ifac[m]%mod*ifac[(n)-(m)]%mod
int main()
{
int n=read(),mx=0;
for(int i=1,x,y; i<=n; ++i)
{
A[i]=x=read(), B[i]=y=read(), ++f[D-x][D-y];//(-x+D,-y+D)
mx=std::max(mx,std::max(x,y));
}
int lim=D+mx;
for(int i=D-mx; i<=lim; ++i)
for(int j=D-mx; j<=lim; ++j)
f[i][j]+=f[i-1][j]+f[i][j-1], Mod(f[i][j]);//a little bigger
LL ans=0;
for(int i=1; i<=n; ++i) ans+=f[D+A[i]][D+B[i]];
ans%=mod;
lim=mx<<2, fac[0]=fac[1]=1;
for(int i=2; i<=lim; ++i) fac[i]=1ll*fac[i-1]*i%mod;
ifac[lim]=FP(fac[lim],mod-2);
for(int i=lim-1; ~i; --i) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
for(int i=1; i<=n; ++i) ans-=C(A[i]*2+B[i]*2,A[i]*2);
ans%=mod, ans*=FP(2,mod-2);
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}
AGC 001E.BBQ Hard(组合 DP)的更多相关文章
- AGC 018E.Sightseeing Plan(组合 DP)
题目链接 \(Description\) 给定三个不相交的矩形\(A(X1,Y1)-(X2,Y2),B(X3,Y3)-(X4,Y4),C(X5,Y5)-(X6,Y6)\),求 从第一个矩形中某点\(a ...
- Atcoder Grand Contest 001E - BBQ Hard(组合意义转化,思维题)
Atcoder 题面传送门 & 洛谷题面传送门 Yet another 思维题-- 注意到此题 \(n\) 数据范围很大,但是 \(a_i,b_i\) 数据范围很小,这能给我们什么启发呢? 观 ...
- CF 553A 组合DP
http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ...
- acdream 1412 2-3Trees (组合+DP)
题意:2-3树的每个结点(除了叶子外)有2或3个孩子(分支),假设是一个满2-3树,那么给出叶子的数量,求这样的树有多少棵.(注:有2个孩子的结点视为相同,有3个孩子的结点视为相同,比如倒数第2层有4 ...
- HDU4532(组合DP)
题目:安排座位 解析:http://www.douban.com/note/269136472/ #include <iostream> #include <string.h> ...
- HDU 4532 湫秋系列故事——安排座位 (组合+DP)
湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- nyoj1076-方案数量 【排列组合 dp】
http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 方案数量 时间限制:1000 ms | 内存限制:65535 KB 难度: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的数据范围比较小,所 ...
随机推荐
- 【Python】批量爬取网站URL测试Struts2-045漏洞
1.概述都懒得写了.... 就是批量测试用的,什么工具里扣出来的POC,然后根据自己的理解写了个爬网站首页URL的代码... #!/usr/bin/env python # -*- coding: u ...
- shell编程之helloworld
/bin/sh与/bin/bash的区别sh:如果前面有语句报错,则报错语句后面的命令不执行bash:如果前面有语句报错,后面的命令也会执行sh跟bash的区别,实际上就是bash有没有开启posix ...
- kerberos介绍
重要术语 1. KDC 全称:key distributed center 作用:整个安全认证过程的票据生成管理服务,其中包含两个服务,AS和TGS 2. AS 全称:authentication s ...
- js动态添加未知新属性
1 前言 由于项目需要,需要实现获取服务器不同网卡扫局域网中的某种类型设备,然而不同服务器的网卡个数是不相同的,从而需要动态增加未知属性来统计不同网卡扫到的设备个数. 2 代码 function ni ...
- Unicode范围预览
链接: https://www.zhangxinxu.com/study/201611/show-character-by-charcode.php?range=4E00-9FBB 备注: Unico ...
- PYTHON-模块 json pickle shelve xml
""" pickle 和 shevle 序列化后得到的数据 只有python才能解析 通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互 我们必须保证这个数据 ...
- Vue源码
参考文章:http://hcysun.me/2017/03/03/Vue%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/?utm_source=qq&utm_medi ...
- css之hover改变子元素和其他元素样式
参考地址:链接 +表示下一级元素,>表示子元素 <!DOCTYPE html> <html> <head lang="en"> <m ...
- Java基础100 待续
1.待续 原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/107 ...
- Eclipse开发环境配置
1. java环境 安装 本系统使用java6开发,老师使用1.6.0 _45版本开发,如下图所示: "开发工具"目录提供了1.6.0 _45版本32位和64位两个安装程序,大家根 ...