整理的算法模板合集: ACM模板
目录
Part 6.2.2 最大公约数
如果两个数有一个共同的约数,那么这个约数就被称为公约数。最大公约数就是指这两个数的所有公约数中,最大的一个。
求解两个数的最大公约数,可以采用欧几里得算法解决。
- P5435 【模板】快速 GCD
- P5436 【XR-2】缘分
- P1029 最大公约数和最小公倍数问题
- P1414 又是毕业季II
- P2152 [SDOI2009]SuperGCD
- P1072 Hankson 的趣味题
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();}<