当前位置: 首页 > news >正文

洛谷P5435

题目分析

给定 \(n\) 个正整数 \(a_1,a_2,\dots,a_n\)\(n\) 个正整数 \(b_1,b_2,\dots,b_n\),计算每对 \((i,j)\)\(a_i\)\(b_j\) 的最大公因数,并输出

\[A_i = \sum_{j=1}^{n} i^j \cdot \gcd(a_i, b_j) \]

的计算结果。

关键点

  1. \(n \leq 5000\),直接计算所有 \(n^2\)辗转相除法朴素更相减损术\(\gcd\)\(O(n^2 \log \text{max})\) 的复杂度。
  2. \(a_i, b_i \leq 10^6\)\(\log \text{max}\) \(\approx\) \(20\),会被卡常。

解题思路

方法分析

由于 \(n\) 最大为 \(5000\)\(n^2 = 25 \times 10^6\),如果我们能在 \(O(1)\) 或近似 \(O(1)\) 的时间内计算 \(\gcd\),那么总计算量大约为 \(2.5 \times 10^7\) 次运算,可以接受。

优化

原理

更相减损术可以使用二进制除法进行优化,当 \(a\)\(b\) 同时为偶数的时候,它们的二进制表示一定有一段相同的后缀 \(0\),计算这个后缀 \(0\) 的长度,分别对 \(a\)\(b\) 进行右移位运算,可以使得至少一个参数变成奇数,然后直接进行下一步的更相减损运算,避免了多次递归除以 \(2\)

实现步骤

  1. 如果 \(a\)\(b\)\(0\),返回另一个数。
  2. 移除 \(a\)\(b\) 的所有因子 \(2\),记录移除的个数。
  3. 使用更相减损术:始终保持 \(a \geq b\),然后用差值替换较大的数。
  4. 直到其中一个为 \(0\),返回另一个数左移之前记录的因子 \(2\) 的个数。

时间复杂度

注:__builtin_ctz() 的时间复杂度是 \(O(1)\)

  • 总时间复杂度:\(O(n^2 \cdot \log \min(a, b))\)
  • 总操作数约 \(5 \times 10^8\),勉强可以接受。

参考代码

#include <bits/stdc++.h>
using namespace std;
long long MOD = 998244353;
typedef long long ll;
ll n, x[5010], y[5010];// 更相减损术(二进制除法)
ll gcd(ll a, ll b) {int ctza = __builtin_ctz(a);//a二进制的后缀0个数int ctzb = __builtin_ctz(b);//b二进制的后缀0个数int ctz = min(ctza, ctzb);//a和b的公共后缀0的个数ll d;//差b >>= ctzb;while (a) {a >>= ctza;d = b - a;// 计算差值ctza = __builtin_ctz(d);// 更新ctza为差值的因子2的个数if (a < b) b = a;// 更新a和b:总让b成为较小的数if (d < 0) a = -d;elsea = d;}return b << ctz;// 返回结果:b左移ctz位(恢复之前移除的因子2)
}int main() {cin >> n;for (int i = 1; i <= n; i++)cin >> x[i];for (int i = 1; i <= n; i++)cin >> y[i];for (int i = 1; i <= n; i++) {ll ans = 0, d = i;for (int j = 1; j <= n; j++) {ans = (ans + d * gcd(x[i], y[j])) % MOD;d = (d * i) % MOD;}cout << ans << endl;}return 0;
}
http://www.jsqmd.com/news/359214/

相关文章:

  • 一键配置RK3588网络与SSH远程连接
  • 细胞多尺度仿真软件:PhysiCell_(2).PhysiCell软件介绍及安装
  • W11电脑无法获取到Windows服务器DHCP的IP地址,如何解决?
  • 新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问
  • ABC_444
  • 低代码处理物联网大数据:Node-RED进阶教程
  • 大数据领域 Hadoop 高可用方案的设计与实现
  • 细胞多尺度仿真软件:MCell_(14).并行计算与大规模仿真
  • 细胞多尺度仿真软件:MCell_(11).MCell在生物医学研究中的应用实例
  • php python+vue网上汽车销售系统的开发
  • 大数据可视化中的用户行为分析展示
  • 深入解析:【无线电控制与数据链探测系统】第2章 无线电与数据链基础
  • 细胞多尺度仿真软件:MCell_(10).仿真结果的分析与可视化
  • 从零开始用自定义 Triton 内核编写 FlashAttention-2
  • ApiScan
  • 神经网络模型基础与简单实现
  • Hadoop vs Spark:哪种大数据框架更适合物联网数据处理?
  • 线性代数资源合集(第二辑)
  • LOJ6485
  • 大数据领域数据清洗的实用工具推荐
  • 别再拍脑袋上线了:用大数据把 A/B 测试和在线实验平台这件事干“正经”
  • 口腔医学教程资源合集
  • php python+vue网上同学录系统_开题报告
  • 提示工程架构师必知:Agentic AI的3大设计模式
  • 基于springboot的运动服服装销售系统
  • javascript数组之循环
  • 例说FPGA:可直接用于工程项目的第一手经验【3.5】
  • AI与提示架构整合的评估方法论:提示工程架构师的指标体系
  • 大数据领域Kafka的性能优化最佳实践
  • 例说FPGA:可直接用于工程项目的第一手经验【3.4】