热门标签 | 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;
}

推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
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社区 版权所有