博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AT1983 BBQ Hard 解题报告
阅读量:5304 次
发布时间:2019-06-14

本文共 1334 字,大约阅读时间需要 4 分钟。

题意

\(\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_i+b_i+a_j+b_j}\)的几何意义,由\(\dbinom{x}{x+y}\)的意义可知这等价于从\((0, \; 0)\)走到\((a_i+a_j,\; b_i+b_j)\)的路径条数,即从\((-a_i, \; -b_i)\)走到\((a_j, \; b_j)\)的路径条数

对于路径条数,我们有dp: \(dp(i,\; j)=dp(i-1, \; j)+dp(i,\; j-1)\),在本题中由于值域较小可以使用,只需在起始时给每个\((-a_i, \; -b_i)\)都加上1(作为起点)即可

正确性显然

代码

#include
using namespace std;#define int long longconst int Mod = 1e9+7 ;const int mxn = 2e6 ;const int N=200005, M=8000;int frac[mxn+5], inv[mxn+5];int dp[M/2+5][M/2+5], base=M/4+2;int n, a[N], b[N];int power(int a, int b){ int res=1, car=a; while(b){ if(b&1) (res*=car)%=Mod; (car*=car)%=Mod; b>>=1; } return res;}void init(){ frac[0]=1 ; for(int i=1;i
0;--i) inv[i]=(inv[i+1]*(i+1))%Mod ; inv[0] = 1 ;}int C(int n, int k){ return ((frac[n]*inv[k]%Mod)*inv[n-k])%Mod ;}long long ans = Mod ;signed main(){ init() ; cin>>n; for(int i=1;i<=n;++i) cin>>a[i]>>b[i], ++dp[base-a[i]][base-b[i]]; for(int i=1;i<=M/2+2;++i) for(int j=1;j<=M/2+2;++j) (dp[i][j]+=(dp[i-1][j]+dp[i][j-1]))%=Mod; for(int i=1;i<=n;++i) (ans+=dp[a[i]+base][b[i]+base]), (ans-=C(2*a[i]+2*b[i], 2*a[i]))%=Mod ; (ans+=Mod)%=Mod ; cout<<(ans*power(2, Mod-2))%Mod<

转载于:https://www.cnblogs.com/tyqtyq/p/11378919.html

你可能感兴趣的文章
图片编辑的利器(介绍韩国免费图片工具PhotoScape)
查看>>
Python基础第十一天:递归函数
查看>>
钉钉机器人
查看>>
博雅PHP高级工程师面试题-自拟
查看>>
SQL SERVER 查看表是否存在
查看>>
关于easyUI实现自定义网格视图
查看>>
JAVA小知识点-Finally和Return的执行关系
查看>>
基站转经纬度
查看>>
构建ASP.NET网站十大必备工具
查看>>
a*寻路分析
查看>>
Android Activity的任务栈和四大启动模式
查看>>
table左边固定-底部横向滚动条-demo
查看>>
MySQL事件异常记录
查看>>
Redis 发布订阅
查看>>
Redis 事务
查看>>
中国创新教育交流会杂感
查看>>
逍遥笔记
查看>>
JSON 命令行工具
查看>>
博士生传给硕士生的经验
查看>>
ubuntu 查看软件包中的内容 (已经安装)
查看>>