热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AoCoder1983[AGC001E]BBQHard(组合数+dp)

problem洛谷链接solution∑i1n∑ji1n(aibiajbjaiaj)∑i1n∑j1n(aibiajbjaiaj)−∑i1n(2(aibi)2ai)2\sum_{

problem

洛谷链接


solution

∑i=1n∑j=i+1n(ai+bi+aj+bjai+aj)=∑i=1n∑j=1n(ai+bi+aj+bjai+aj)−∑i=1n(2(ai+bi)2ai)2\sum_{i=1}^{n}\sum_{j=i+1}^n\binom{a_i+b_i+a_j+b_j}{a_i+a_j}=\frac{\sum_{i=1}^{n}\sum_{j=1}^n\binom{a_i+b_i+a_j+b_j}{a_i+a_j}-\sum_{i=1}^{n}\binom{2(a_i+b_i)}{2a_i}}{2} i=1nj=i+1n(ai+ajai+bi+aj+bj)=2i=1nj=1n(ai+ajai+bi+aj+bj)i=1n(2ai2(ai+bi))

Cx+yxC_{x+y}^xCx+yx 可以视为网格图中 (0,0)→(x,y)(0,0)\rightarrow (x,y)(0,0)(x,y) 的路径方案数

Cai+bi+aj+bjai+aj=C(ai+bi)−(−aj,−bj)ai−(−aj)C_{a_i+b_i+a_j+b_j}^{a_i+a_j}=C_{(a_i+b_i)-(-a_j,-b_j)}^{a_i-(-a_j)}Cai+bi+aj+bjai+aj=C(ai+bi)(aj,bj)ai(aj) 即视为 (−aj,−bj)→(ai,bi)(-a_j,-b_j)\rightarrow (a_i,b_i)(aj,bj)(ai,bi) 的路径方案数。

那么这道题就是多源汇路径数了。

在一开始读入数据的时候,起点方案数增加一,f[−ai][−bi]++f[-a_i][-b_i]++f[ai][bi]++

然后暴力转移 dpdpdpfi,j←+fi−1,j+fi,j−1f_{i,j}\leftarrow^+ f_{i-1,j}+f_{i,j-1}fi,j+fi1,j+fi,j1,求出到 f[ai][bi]f[a_i][b_i]f[ai][bi] 的方案数。

网格图的坐标 ∈[−2000,2000]\in[-2000,2000][2000,2000],整体平移 2e32e32e3 ,这都是细节实现。


code

#include
using namespace std;
#define int long long
#define mod 1000000007
#define MAX 2000
int a[200005], b[200005];
int fac[8005], inv[8005];
int f[4005][4005];
int n;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}int C( int n, int m ) { if( n < m ) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%lld %lld", &a[i], &b[i] );f[MAX - a[i]][MAX - b[i]] ++;}fac[0] = inv[0] = 1; for( int i = 1;i <= (MAX << 2);i ++ ) fac[i] = fac[i - 1] * i % mod;inv[MAX << 2] = qkpow( fac[MAX << 2], mod - 2 );for( int i = (MAX << 2) - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;for( int i = 0;i <= (MAX << 1);i ++ )for( int j = 0;j <= (MAX << 1);j ++ ) {if( i ) ( f[i][j] += f[i - 1][j] ) %= mod;if( j ) ( f[i][j] += f[i][j - 1] ) %= mod;}int ans = 0, cnt = 0;for( int i = 1;i <= n;i ++ ) {( cnt += C( a[i] + b[i] << 1, a[i] << 1 ) ) %= mod;( ans += f[MAX + a[i]][MAX + b[i]] ) %= mod;}printf( "%lld\n", ( ans - cnt + mod ) % mod * qkpow( 2, mod - 2 ) % mod );return 0;
}

推荐阅读
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 编程解析:CF989C 花朵之雾 (构造算法)
    本文深入探讨了CF989C '花朵之雾'问题的构造算法,提供了详细的解题思路和代码实现。 ... [详细]
  • 本文详细探讨了HihoCoder平台上的1398号问题——最大权闭合子图的求解方法。通过具体实例,深入分析了最大权闭合子图的概念及其算法实现。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
author-avatar
顾凡人_479
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有