【题单 - 数学专题】最大公约数

这篇博客整理了关于最大公约数的算法模板,包括基于值域预处理的快速GCD算法,以及在不同题目中应用GCD解决问题的方法,如缘分问题、最大公约数和最小公倍数问题等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理的算法模板合集: ACM模板


Part 6.2.2 最大公约数

如果两个数有一个共同的约数,那么这个约数就被称为公约数。最大公约数就是指这两个数的所有公约数中,最大的一个。

求解两个数的最大公约数,可以采用欧几里得算法解决。

P5435 基于值域预处理的快速 GCD算法

给定 n n n 个正整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an ,再给定 n n n 个正整数 b 1 , b 2 , … , b n b_1,b_2,\dots,b_n b1,b2,,bn ,你需要对每对 ( i , j ) (i,j) (i,j)求出 a i a_i ai b j b_j bj 的最大公因数。

不难发现你的输出应有 n 2 n^2 n2 个正整数。为了减少输出对程序的运行效率的影响,你只需要输出 nn 行,每行一个整数 A i A_i Ai

其中对于 i ∈ [ 1 , n ] i ∈ [ 1 , n ] , A i = ∑ j = 1 n i j gcd ⁡ ( a i , b j ) A i\in[1,n]i∈[1,n],A_i=\sum_{j=1}^{n}i^j\gcd(a_i,b_j)A i[1,n]i[1,n]Ai=j=1nijgcd(ai,bj)A。由于答案可能过大,你只需要输出模 998 , 244 , 353 998,244,353 998,244,353 后的结果即可。

还是直接上模板。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>

using namespace std;
typedef long long ll;

const int N = 5000, M = 1000000, T = 1000, Mod = 998244353;

int pre[T + 2][T + 2];
int a[N + 2], b[N + 2];
int fac[M + 2][3];
bool isp[M + 2];
int pri[M / 10], tot;
int n;

inline int read()
{
   
   
	int re=0,k=1;char ch=getchar();
	while(ch>'9'||ch<'0'){
   
   if(ch=='-')k=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){
   
   re=re*10+ch-48;ch=getchar();}<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁凡さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值