ATG1E BBQ Hard 学习笔记

news/2025/2/22 13:32:59/文章来源:https://www.cnblogs.com/OrinLoong/p/18719456

ATG1E BBQ Hard 学习笔记

Luogu Link

题意简述

计算 $$\sum_{i=1}^n \sum_{j=i+1}^n \dbinom{a_i+b_i+a_j+b_j}{a_i+a_j}$$ 的值。答案对 \(10^9+7\) 取模。

\(N\le 2\times 10^5,a_i,b_i\le 2\times 10^3\)

做法解析

\(O(N^2)\) 的做法是暴力枚举 \(i,j\)\(O(1)\) 计算出 \(\dbinom{a_i+b_i+a_j+b_j}{a_i+a_j}\),将结果全部相加即可。

怎么优化?我们不妨先考虑一下其组合意义。众所周知 \(\dbinom{x+y}{x}\) 的一个组合意义是:只往右或上走,从 \((0,0)\) 走到 \((x,y)\) 的方案数(相当于往 \(x\) 个向右走操作中插入 \(y\) 个向上走操作的方案数)。所以我们要求的东西就是从 \((0,0)\) 走到所有 \((a_i+a_j,b_i+b_j)\) 的方案数。这么做起点只有一个,却要一个个统计 \(O(N^2)\) 个终点的答案,太劣了。

考虑复杂度平衡。我们把网格图从 \(((0,0),(a_i+a_j,b_i+b_j))\) 平移到 \(((-a_i,-b_i),(a_j,b_j))\)。现在就变为了 \(O(N)\) 个起点,\(O(N)\) 个终点。我们 \(O(N)\) 地将每个起点的初始方案数加一,然后递推一遍组合数,最后 \(O(N)\) 收集每个终点的方案数。优异啊!

pEMpJVe.md.png

由于题目要求只统计 \(i<j\) 的方案数,所以要减去自己做起点到自己做重点的方案数,最后乘上 \(2\) 的逆元。这道题就做完了!

代码实现

#include <bits/stdc++.h>
using namespace std;
namespace obasic{typedef long long lolo;template <typename _T>void readi(_T &x){_T k=1;x=0;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')k=-1;for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0';x*=k;return;}template <typename _T>void writi(_T x){if(x<0)putchar('-'),x=-x;if(x>9)writi(x/10);putchar(x%10+'0');}
};
using namespace obasic;
const int MaxN=2e5+5,MaxM=2e3+5,Mod=1e9+7,Df=2001;
int N;lolo A[MaxN],B[MaxN],facr[MaxM<<2],finv[MaxM<<2];
namespace omathe{lolo fastpow(lolo a,lolo b,lolo p){lolo res=1;for(;b;(a*=a)%=p,b>>=1)if(b&1)(res*=a)%=p;return res;}lolo getinv(lolo a,lolo p){return fastpow(a,p-2,p);}lolo Comb(lolo n,lolo m,lolo p){return facr[n]*finv[n-m]%p*finv[m]%p;}
};
using namespace omathe;
void prework(int n){facr[0]=finv[0]=1;for(int i=1;i<=n;i++)facr[i]=facr[i-1]*i%Mod;finv[n]=getinv(facr[n],Mod);for(int i=n-1;i;i--)finv[i]=finv[i+1]*(i+1)%Mod;
}
lolo C[MaxM<<1][MaxM<<1],ans;
int main(){readi(N);prework(Df*4+4);for(int i=1;i<=N;i++)readi(A[i]),readi(B[i]);for(int i=1;i<=N;i++)C[Df-A[i]][Df-B[i]]++;for(int i=1;i<=Df*2;i++){for(int j=1;j<=Df*2;j++){(C[i][j]+=(C[i-1][j]+C[i][j-1])%Mod)%=Mod;}}for(int i=1;i<=N;i++){(ans+=C[A[i]+Df][B[i]+Df])%=Mod;(ans+=Mod-Comb(A[i]*2+B[i]*2,A[i]*2,Mod))%=Mod;}(ans*=getinv(2,Mod))%=Mod;writi(ans);return 0;
}

反思总结

了解 \(\dbinom{x+y}{x}\) 的一个组合意义:只往右或上走,从 \((0,0)\) 走到 \((x,y)\) 的方案数。
熟练运用复杂度平衡思想,见到 \(O(1)-O(N^2)\) 的东西尝试平衡为 \(O(N)-O(N)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/885406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VMware vSphere】扩容或缩减 vCenter Server 的磁盘空间大小。

我们在部署 vCenter Server 时,根据不同环境的情况,可以选择不同的部署选项,比如环境中的主机可能运行了 100 个,或者虚拟机运行了 1000 个,此时按照官方推荐的选择“小型环境”部署选项即可满足需求;如果主机超过了 100 个,可能在 1000 个以内,或者虚拟机超过了 1000 …

day:3软件测试分类

一、按开发阶段划分 (1)单元测试 (2)集成测试 (3)系统测试 (4)集成测试 二、按查看代码分类 (1)黑盒测试 定义:是一种功能测试,测试中把测试的软件当成一个盒子,不关心盒子内部结构是什么,只关心软件的输入和输出。 例如:一个计算器,输入:1+1 输出:2,正确;…

活动管理神器来袭!板栗看板让你告别繁琐,拥抱高效

变革模型与项目管理工具的结合运用可以形成一个系统化、高效化的变革管理体系。通过明确变革需求与目标、执行变革计划、评估与反馈以及持续优化改进等步骤,可以确保变革的顺利实施和成功落地。项目管理中的变革模型是指一系列指导和管理组织内部变革过程的框架和方法。这些模…

劲爆!微信宣布接入 DeepSeek R1!!

大家好,我是R哥。 太劲爆了,连浓眉大眼的微信现在也接入了 DeepSeek,但还在还处于灰度测试阶段,入口比较隐蔽,要从搜索框下面的「AI 搜索」按钮进去。 如图所示:对于微信这么大一个国民级产品来说,在搜索领域引入 AI,肯定是看中了搜索入口的重要性,接入 DeepSeek 不仅…

懒人福音!一款基于 Go 实现的 Docker 终端管理工具!

lazydocker —— 一个基于 Go 编写实现的终端 Docker 管理 UI 工具,为用户提供了一种更直观、便捷的方式来管理 Docker 容器、镜像、数据卷、网络等资源。大家好,我是 Java陈序员。 之前给大家介绍一个在线的 Docker 可视化管理面板。 运维神器!Docker 可视化管理面板! 今天…

专利线框图绘制和导出,从Blender到3ds max

Blender软件设计3维的模型简单好用, 但是它生成的线框图线条太多,不符合专利要求,如下图: 我的方法是导出fbx格式模型,用下面教程里的方法生成线框图,最后用ps处理了一下, https://www.bilibili.com/video/BV1Bz421o7tq/?spm_id_from=333.337.search-card.all.click&a…

如何安全高效地实现云租户之间文件传输,优化业务效率?

基于提高运营效率、降低成本、增强灵活性和创新性等多方面考,越来越多的企业选择将业务和数据迁移到云端,因此会产生云租户之间文件传输的场景。云租户之间文件传输时可能会面临以下问题: 1.安全性:数据传输过程中可能存在安全隐患,如数据泄露、窃听或篡改等问题,也可能。…

为什么说在企业级应用开发中,后端往往是效率杀手?

大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。在企业级应用开发中,如果你们团队人员是前后端分离的,你会发现联调让人很不省心,可以说往往是效率杀手,而提供联调的API一般由后端人员提供,为什么…

开源EFCore 对比实体与实际数据库结构的工具-GZY.EFCoreCompare

前言 GZY.EFCoreCompare 是一个用于 对比数据库结构和 EF Core 代码中的 DbContext 的库。 它基于 EF Core 的 Scaffolding 机制,生成 DatabaseModel(从数据库提取的模型), 并与代码中的 DbContext 进行比对,从而找出两者之间的差异。 开源项目地址:GZY.EFCoreCompare欢迎s…

趁着过年的时候手搓了一个低代码框架

这个春节假期,我干了一件大事:春节期间手搓了一个低代码框架——CodeSpirit(码灵)。 为什么手搓低代码框架? 市面上的低代码平台不少,但大多存在“黑箱生成、性能损耗、扩展性差”的痛点。开发者一旦需要深度定制,往往束手无策。而CodeSpirit的初衷是:让全栈开发回归工…

C# TorchSharp 图像分类实战:VGG大规模图像识别的超深度卷积网络

目录VGG大规模图像识别的超深度卷积网络数据集直接下载opendatalab 数据集社区自定义数据集模型训练 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址: https://torch.whuanle.cn 电子书仓库:https://github.com/whuanle/cs_pytorch Maomi.Torch 项目仓库:https://…