最优秀的人,往往是最努力的,如果没有了勤奋努力的学习,天才也将一无所获。所以,我从来没有停止过学习,只要你不抗拒学习,无论从广度还是深度上,都秉持着一种钻研的态度,遇到问题钻研到底,那么我相信,再难的问题都会有解决的一天。
高中那时候最流行的一句话叫:学好数理化,走遍天下都不怕!确实,数学对我而言,也是一个又爱又恨的存在,本来引以为傲的数学,高考的时候没有发挥好,最后和自己想去的大学失之交臂。正所谓,成也数学,败也数学。不过,这已经不重要了,把握当下吧!学习算法的途中,邂逅了数论,让我对数学又重燃激情,那么这一章,就让我带领大家来见识一下数论的魅力吧!
【例题1】(公元1987年初二数学竞赛题) x , y , z x,y,z x,y,z 均为整数,若 11 ∣ ( 7 x + 2 y − 5 z ) 11|(7x+2y-5z) 11∣(7x+2y−5z),求证: 11 ∣ ( 3 x − 7 y + 12 z ) 11|(3x-7y+12z) 11∣(3x−7y+12z)。
朴素算法
优化1
优化2
lim x → ∞ π ( x ) x / l n ( x ) = 1 \lim\limits_{x\rightarrow\infty}\frac{π(x)}{x / ln(x)}=1 x→∞limx/ln(x)π(x)=1
【例题2】给定 n ( n < 10000 ) n(n < 10000) n(n<10000) 个数,范围为 [ 1 , 2 30 ) [1, 2^{30}) [1,230),判定它是素数还是合数。
notprime[i]
标记 i i i 是素数与否,筛选法有很多,这里介绍一种最常用的筛选法——Eratosthenes筛选法。#define maxp 65536
#define ll long long
int primes[maxp];
bool notprime[maxp]; // 1
void Eratosthenes() {
notprime[1] = true;
primes[0] = 0;
for (int i = 2; i < maxp; i++) {
if (!notprime[i]) {
primes[++primes[0]] = i; // 2
for (ll j = (ll)i*i; j < maxp; j += i) {
notprime[j] = true; // 3
}
}
}
}
1)notprime[i] == true
表明 i i i 不是素数,否则 i i i 为素数(因为全局变量初始值为 false,筛选法预处理只做一次,所以不需要初始化);
2)首先从小到大进行枚举,遇到notprime[i] == false
的,表明 i i i 是素数,将 i i i 保存到数组primes[]
中(为了少写一个变量,用primes[0]
来存储素数个数字段);
3)将 i i i 的倍数都标记为合数,由于 i ∗ 2 、 i ∗ 3 、 i ∗ ( i − 1 ) i*2、i*3、i*(i-1) i∗2、i∗3、i∗(i−1)在 [ 1 , i ) [1, i) [1,i) 的筛选过程中必定已经被标记为合数了,所以 i i i 的倍数只需要从 i ∗ i i*i i∗i 开始即可,避免不必要的时间开销。需要注意 i ∗ i i*i i∗i 超出整型后变成负数的问题,所以转化成 long long
。
分析:虽然这个算法有两个嵌套的轮询,但是第二个轮询只有在 i i i 是素数的时候才会执行,而且随着 i i i 的增大,它的倍数会越来越少,所以整个算法的时间复杂度并不是 O ( n 2 ) O(n^2) O(n2),而且远远小于 O ( n 2 ) O(n^2) O(n2)。
( 可以在内层循环notprime
进行赋值前加入一个计数器 c o u n t count count,计数器的值就是该程序的总执行次数,对 m a x p maxp maxp 进行不同的值测试发现 i n t ( c o u n t / m a x p ) int(count / maxp) int(count/maxp) 的值随着 m a x p maxp maxp 的增长变化非常小,总是维持在 2 左右,所以这个算法的复杂度可以近似看成 是 O ( n ) O(n) O(n),更加确切的可以说是 O ( n C ) O(nC) O(nC),其中 C C C 为常数, C C C 一般取 2 )。
事实上,实际应用中由于空间的限制(空间复杂度为 O ( n ) O(n) O(n)), m a x n maxn maxn 的值并不会取的很大, 1 0 7 10^7 107 基本已经算是极限了,再大的素数测试就需要用到 拉宾-米勒 ( R a b i n − M i l l e r Rabin-Miller Rabin−Miller) 大数判素了,这个会在后面章节进行展开。
给定一个数 n n n,如何将它拆分成素数的乘积呢?
还是用上面讲到的试除法,假设 n = p m n = pm n=pm 并且 m > 1 m>1 m>1,其中 p p p 为素数,如果 p > n p > \sqrt n p>n,那么根据算数基本定理, m m m 中必定存在一个小于等于 n \sqrt n n 的素数,所以我们不妨设 p < = n p <= \sqrt n p<=n。
然后通过枚举 [ 2 , n ] [2, \sqrt n] [2,n] 的素数,如果能够找到一个素数 p p p,使得 n m o d p ≡ 0 n \mod p \equiv 0 nmodp≡0(mod 表示取余数、也称为模)。于是 m = n / p m = n / p m=n/p,这时还需要注意一点,因为 m m m 中可能也有 p p p 这个素因子,所以如果 p ∣ m p|m p∣m,需要继续试除,令 m ′ = m / p m' = m/p m′=m/p,直到将所有的素因子 p p p 除尽,统计除的次数 e e e,于是我们得到了 n = p e ∗ n ′ n = p^e * n' n=pe∗n′,然后继续枚举素数对 n ′ n' n′ 做同样的试除。
枚举完 [ 2 , n ] [2, \sqrt n] [2,n] 的素数后,得到表达式如下所示:
n = p 1 e 1 p 2 e 2 p 3 e 3 . . . p k e k S n = p_1^{e_1}p_2^{e_2}p_3^{e_3}...p_k^{e_k} S n=p1e1p2e2p3e3...pkekS
这时有两种情况:
i) S = = 1 S == 1 S==1,则素数分解完毕;
ii) S > 1 S > 1 S>1, 根据算术基本定理, S S S 必定为素数,而且是大于 n \sqrt n n 的素数,并且最多只有 1 个,这种情况同样适用于 n n n 本身就是素数的情况,这时 n = S n = S n=S。
这样的分解方式称为因数分解,各个素因子可以用一个二元的结构体来存储。算法时间复杂度为 O ( s ) O(s) O(s), s s s 为 n \sqrt n n内素数的个数。
C++ 代码实现如下:
struct factor {
int prime, count;
factor() {
}
factor(int p, int c) : prime(p), count(c) {
}
};
void Factorization(int n, vector <factor>& ans) {
ans.clear();
if (n == 1) {
return;
}
for (int i = 1; i <= primes[0]; i++) {
if (0 == n % primes[i]) {
factor f(primes[i], 0);
while (0 == n % primes[i]) {
n /= primes[i];
f.count++;
}
ans.push_back(f);
}
if (n == 1) {
return;
}
}
ans.push_back(factor(n, 1));
}
朴素的求因子个数的方法为枚举 [ 1 , n ] [1, n] [1,n] 的数进行余数为 0 判定,复杂度为 O ( n ) O(n) O(n),这里加入一个小优化,如果 m m m 为 n n n 的因子,那么必然 n / m n/m n/m 也为 n n n 的因子,不妨设 m < = n / m m <= n/m m<=n/m,则有 m < = n m <= \sqrt n m<=n,所以只要枚举从 [ 1 , n ] [1, \sqrt n] [1,n] 的因子然后计数即可,复杂度变为 O ( n ) O(\sqrt n) O(n)。
根据算术基本定理,容易发现 n n n 的因子一定是 p 1 、 p 2 、 . . . 、 p k p_1、p_2、...、p_k p1、p2、...、pk 的组合,并且 p 1 p_1 p1 可以取的个数为 [ 0 , e 1 ] [0, e_1] [0,e1], p 2 p_2 p2 可以取的个数为 [ 0 , e 2 ] [0, e_2] [0,e2], p k p_k pk 可以取的个数为 [ 0 , e k ] [0, e_k] [0,ek],所以根据乘法原理,总的因子个数记为 g ( n ) g(n) g(n),等于 e i + 1 e_i+1 ei+1 的连乘,即: g ( n ) = ∏ i = 1 k ( e i + 1 ) g(n) = \prod_{i=1}^{k} (e_i + 1) g(n)=i=1∏k(ei+1)
算法时间复杂度即求素因子分解的复杂度,为 O ( s ) O(s) O(s)。
【例题3】给定 x , y ( x , y < 2 31 ) x,y(x, y < 2^{31}) x,y(x,y<231),求 x y x^y xy 的因子数 m o d 10007 \mod 10007 mod10007。
【例题4】给定 x , y ( x , y < 2 31 ) x,y(x, y < 2^{31}) x,y(x,y<231),求 x y x^y xy 的所有因子之和 m o d 10007 \mod 10007 mod10007。
两个数 a a a 和 b b b 的最大公约数 (Greatest Common Divisor) 是指同时整除 a a a 和 b b b 的最大因数,记为 g c d ( a , b ) gcd(a, b) gcd(a,b)。特殊的,当 g c d ( a , b ) = 1 gcd(a, b) = 1 gcd(a,b)=1,我们称 a a a 和 b b b 互素(上文谈到整除的时候略有提及)。
两个数 a a a 和 b b b 的最小公倍数 (Leatest Common Multiple) 是指同时被 a a a 和 b b b 整除的最小倍数,记为 l c m ( a , b ) lcm(a, b) lcm(a,b)。特殊的,当 a a a 和 b b b 互素时, l c m ( a , b ) = a b lcm(a, b) = ab lcm(a,b)=ab。
g c d gcd gcd 是基础数论中非常重要的概念,求解 g c d gcd gcd 一般采用辗转相除法(这个方法会在第二章开头着重介绍,这里先引出概念),而求 l c m lcm lcm 需要先求 g c d gcd gcd,然后容易得到: l c m ( a , b ) = a b g c d ( a , b ) lcm(a, b) = \frac {ab} { gcd(a, b)} lcm(a,b)=gcd(a,b)ab。
根据算术基本定理,有如下公式满足:
a = p 1 x 1 p 2 x 2 p 3 x 3 . . . p k x k a = p_1^{x_1}p_2^{x_2}p_3^{x_3}...p_k^{x_k} a=p1x1p2x2p3x3...pkxk b = p 1 y 1 p 2 y 2 p 3 y 3 . . . p k y k b = p_1^{y_1}p_2^{y_2}p_3^{y_3}...p_k^{y_k} b=p1y1p2y2p3y3...pkyk
那么 g c d ( a , b ) gcd(a,b) gcd(a,b) 和 l c m ( a , b ) lcm(a,b) lcm(a,b) 可以表示成如下等式:
g c d ( a , b ) = p 1 m i n ( x 1 , y 1 ) p 2 m i n ( x 2 , y 2 ) p 3 m i n ( x 3 , y 3 ) . . . p k m i n ( x k , y k ) gcd(a,b)=p_1^{min(x_1,y_1)}p_2^{min(x_2,y_2)}p_3^{min(x_3,y_3)}...p_k^{min(x_k,y_k)} gcd(a,b)=p1min(x1,y1)p2min(x2,y2)p3min(x3,y3)...pkmin(xk,yk) l c m ( a , b ) = p 1 m a x ( x 1 , y 1 ) p 2 m a x ( x 2 , y 2 ) p 3 m a x ( x 3 , y 3 ) . . . p k m a x ( x k , y k ) lcm(a,b)=p_1^{max(x_1,y_1)}p_2^{max(x_2,y_2)}p_3^{max(x_3,y_3)}...p_k^{max(x_k,y_k)} lcm(a,b)=p1max(x1,y1)p2max(x2,y2)p3max(x3,y3)...pkmax(xk,yk)
需要说明的是这里的 a a a 和 b b b 的分解式中的指数是可以为 0 的,也就是说 p 1 p_1 p1 是 a a a 和 b b b 中某一个数的最小素因子, p 2 p_2 p2 是次小的素因子。 l c m ( a , b ) lcm(a, b) lcm(a,b) 和 g c d ( a , b ) gcd(a, b) gcd(a,b) 相乘,相当于等式右边的每个素因子的指数相加,即 m i n ( x i , y i ) + m a x ( x i , y i ) = x i + y i min(x_i, y_i) + max(x_i, y_i) = x_i + y_i min(xi,yi)+max(xi,yi)=xi+yi,正好对应了 a a a 和 b b b 的第 i i i 个素数分量的指数之和,从而得到:
a b = l c m ( a , b ) ∗ g c d ( a , b ) ab = lcm(a, b) * gcd(a, b) ab=lcm(a,b)∗gcd(a,b)
【例题5】三个未知数 x , y , z x, y, z x,y,z ,且 g c d ( x , y , z ) = G , l c m ( x , y , z ) = L gcd(x,y,z) = G,lcm(x,y,z) = L gcd(x,y,z)=G,lcm(x,y,z)=L, G G G 和 L L L 已知,求 ( x , y , z ) (x, y, z) (x,y,z) 三元组的个数。
( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi) | 排列后种数 |
---|---|
(g,l,l) | 3 |
(g,g,l) | 3 |
(g,k,l),其中 (g(l-g-1)*6 |
|
【例题6】一个 n n n 位十进制数 ( n < = 1000000 ) (n <= 1000000) (n<=1000000) 必定包含 1 、 2 、 3 、 4 1、2、3、4 1、2、3、4 四个数字,现在将它顺序重排,求给出一种方案,使得重排后的数是 7 7 7 的倍数。
b%7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
b | 4312 | 2143 | 1234 | 4231 | 1243 | 2413 | 4213 |
【例题7】 f [ 1 ] = a , f [ 2 ] = b , f [ 3 ] = c f[1] = a, f[2] = b, f[3] = c f[1]=a,f[2]=b,f[3]=c, 当 n > 3 n>3 n>3 时 f [ n ] = ( A ∗ f [ n − 1 ] + B ∗ f [ n − 2 ] + C ∗ f [ n − 3 ] ) % 54 f[n] = (A*f[n-1] + B*f[n-2] + C*f[n-3]) \% 54 f[n]=(A∗f[n−1]+B∗f[n−2]+C∗f[n−3])%54,给定 a , b , c , A , B , C a, b, c, A, B, C a,b,c,A,B,C,求 f [ n ] f[n] f[n],(其中 n < 2 31 n < 2^{31} n<231)。
定理: g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)。
Type gcd(Type a, Type b) {
return b ? gcd(b, a%b) : a;
}
【例题8】 f [ 0 ] = 0 f[0] = 0 f[0]=0, 当 n > 1 n>1 n>1 时, f [ n ] = ( f [ n − 1 ] + a ) f[n] = (f[n-1]+a) % b f[n]=(f[n−1]+a),给定 a a a 和 b b b,问是否存在一个自然数 k ( 0 < = k < b ) k (0 <= k< b) k(0<=k<b) 是 f [ n ] f[n] f[n] 永远都取不到的。
这个方程的求解步骤如下:
a) 首先求出 a a a 和 b b b 的最大公约数 d = g c d ( a , b ) d = gcd(a, b) d=gcd(a,b),那么原方程可以转化成 d ( a x d + b y d ) = c d(a \frac xd + b \frac yd) = c d(adx+bdy)=c,容易知道 ( a x d + b y d ) (a \frac xd + b \frac yd) (adx+bdy) 为整数,如若 d d d 不能整除 c c c,方程必然无解,算法结束;否则进入b)。
b) 由a)可以得知,方程有解则一定可以表示成 a x + b y = c = g c d ( a , b ) ∗ c ′ ax + by = c = gcd(a, b)*c' ax+by=c=gcd(a,b)∗c′,那么我们先来看如何求解 d = g c d ( a , b ) = a x + b y d = gcd(a, b) = ax + by d=gcd(a,b)=ax+by,根据欧几里德定理,有:
d = g c d ( a , b ) = g c d ( b , a % b ) = b x ′ + ( a % b ) y ′ = b x ′ + [ a − b ∗ a b ] y ′ = a y ′ + b [ x ′ − a b y ′ ] \begin{aligned} d &= gcd(a, b) \\&= gcd(b, a\%b) \\&= bx' + (a\%b)y' \\&= bx' + [a-b*\frac ab]y' \\&= ay' + b[x' - \frac aby']\end{aligned} d=gcd(a,b)=gcd(b,a%b)=bx′+(a%b)y′=bx′+[a−b∗ba]y′=ay′+b[x′−bay′]于是有 x = y ′ , y = x ′ − ( a b ) y ′ x = y', y = x' - (\frac ab)y' x=y′,y=x′−(ba)y′
由于 g c d ( a , b ) gcd(a, b) gcd(a,b) 是一个递归的计算,所以在求解 ( x , y ) (x, y) (x,y) 时, ( x ′ , y ′ ) (x', y') (x′,y′) 其实已经利用递归计算出来了,递归出口为 b = = 0 b == 0 b==0 的时候(对比辗转相除,也是 b = = 0 b == 0 b==0 的时候递归结束),那么这时方程的解 x 0 = 1 , y 0 = 0 x_0 = 1, y_0 = 0 x0=1,y0=0。
C++ 代码实现如下:
// aX + bY = 1
Type ExpGcd(Type a, Type b, Type &X, Type &Y) {
Type q, temp;
if( !b ) {
q = a; X = 1; Y = 0;
return q;
}else {
q = ExpGcd(b, a % b, X, Y);
temp = X;
X = Y;
Y = temp - (a / b) * Y;
return q;
}
}
【例题9】有两只青蛙,青蛙 A 和 青蛙 B ,它们在一个首尾相接的数轴上。设青蛙 A 的出发点坐标是 x x x,青蛙 B 的出发点坐标是 y y y 。青蛙A一次能跳 m m m 米,青蛙 B 一次能跳 n n n 米,两只青蛙跳一次所花费的时间相同。数轴总长 L L L 米。要求它们至少跳了几次以后才会碰面。
朴素算法
优化算法
const int MAX_NUMBER = 10000010;
const int MAXP = 3163; // (int)(sqrt(MAX_NUMBER*1.0) + 1);
#define LL long long
bool notprime[MAX_NUMBER];
int primes[MAXP];
int eula[MAX_NUMBER];
void eulaFilter() {
int i, j;
notprime[1] = 1;
eula[1] = 1;
// 1.枚举每个数
for (i = 2; i < MAX_NUMBER; ++i) {
if (!notprime[i]) {
// 2.素数i的欧拉函数i-1
eula[i] = i - 1;
if (i < MAXP) {
primes[++primes[0]] = i;
}
for (j = i + i; j < MAX_NUMBER; j += i) {
notprime[j] = 1;
// 3.非素数的欧拉函数为本身*素数分量(1-1/i)的乘积
if (!eula[j]) eula[j] = j;
eula[j] = eula[j] / i*(i - 1);
}
}
}
}
欧拉定理
费马小定理
a、Rabin-Miller 大素数判定
b、Pollard-rho 大数因式分解
c、Baby-Step Giant-Step 离散对数
a x ≡ b ( m o d n ) a^x \equiv b (\mod n) ax≡b(modn)
d、二次剩余
e、RSA 算法
1、素数和因数分解
题目链接 | 难度 | 解法 |
---|---|---|
Largest prime factor | ★☆☆☆☆ | 素数筛选 |
The number of divisors | ★☆☆☆☆ | 因子数 |
七夕节 | ★☆☆☆☆ | 因子和 |
Happy 2004 | ★☆☆☆☆ | X^Y的因子和 |
Number Sequence | ★☆☆☆☆ | 循环节的经典问题 |
Beijing 2008 | ★★☆☆☆ | X^Y的因子和 |
f(n) | ★★☆☆☆ | 找规律+素数筛选 |
本原串 | ★★☆☆☆ | 整除性质 + 因子枚举 |
Special Prime | ★★☆☆☆ | 3n^2+3n+1 的素数判定问题 |
YAPTCHA | ★★☆☆☆ | 素数性质 |
Factorial Simplificat | ★★★☆☆ | 因式分解+树状数组+DFS |
Gcd & Lcm game | ★★★★☆ | 因式分解+线段树 |
2、GCD && LCM
题目链接 | 难度 | 解法 |
---|---|---|
hide handkerchief | ★☆☆☆☆ | 互素判定 |
GCD and LCM | ★★☆☆☆ | GCD和LCM性质 + 排列组合 |
Revenge of GCD | ★★☆☆☆ | 辗转相除+因子枚举 |
Least common multiple | ★★★☆☆ | GCD性质 + 完全背包 |
3、同余性质 、二分幂、循环节
题目链接 | 难度 | 解法 |
---|---|---|
N!Again | ★☆☆☆☆ | 同余的乘法性质 |
Ice Rain | ★★☆☆☆ | 余数性质 |
The Two Note Rag | ★★☆☆☆ | 二分快速幂 |
Jacobi symbol | ★★☆☆☆ | 二分快速幂 + 二次剩余判定 |
Love you TenThous years | ★★☆☆☆ | 规律 |
TCE-frep number system | ★★☆☆☆ | 完全数 |
Perfect Squares | ★★☆☆☆ | 同余性 + 循环节 |
X mod f(x) | ★★★☆☆ | 利用同余原理进行动态规划 |
Interesting Fibonacci | ★★★★☆ | 复杂的循环节 |
4、模线性方程和逆元
题目链接 | 难度 | 解法 |
---|---|---|
青蛙的约会 | ★☆☆☆☆ | 线性同余 |
Romantic | ★☆☆☆☆ | 线性同余 |
Robot | ★★☆☆☆ | 逆元 |
An easy problem | ★★☆☆☆ | 逆元 |
A/B | ★★☆☆☆ | 逆元入门题 |
A New Change Problem | ★★☆☆☆ | 同余推导 |
Central Meridian Number | ★★☆☆☆ | 线性同余+枚举 |
number theory | ★★☆☆☆ | 快速幂取模 + 欧几里德定理 |
Counting Problem | ★★★☆☆ | 逆元 + 组合数取模 |
Multiply game | ★★★★☆ | 树状数组 + 逆元 |
5、模线性方程组
题目链接 | 难度 | 解法 |
---|---|---|
Chinese remainder theorem again | ★★☆☆☆ | 中国剩余定理 简化版 |
Strange Way to Express Integers | ★★★☆☆ | 中国剩余定理 模板题 |
Hello Kiki | ★★★☆☆ | 中国剩余定理 模板题 |
X问题 | ★★★☆☆ | 中国剩余定理 模板题 |
And Now, a Remainder from | ★★★☆☆ | 中国剩余定理 模板题 |
6、欧拉函数、欧拉定理、费马小定理
题目链接 | 难度 | 解法 |
---|---|---|
2^x mod n = 1 | ★☆☆☆☆ | 费马小定理 简化版的 |
HeHe | ★☆☆☆☆ | 欧拉函数 |
GCD | ★★☆☆☆ | 欧拉函数 |
Become A Hero | ★★☆☆☆ | 筛选法求欧拉函数 |
The Euler function | ★★☆☆☆ | 筛选法求欧拉函数 |
The Luckiest number | ★★★☆☆ | 费马小定理 |
Calculation | ★★★☆☆ | 费马小定理 |
Description has only two Sentences | ★★★☆☆ | 费马小定理,我的题 |
6、容斥原理
题目链接 | 难度 | 解法 |
---|---|---|
How many integers | ★★☆☆☆ | 容斥原理 |
Visible Trees | ★★☆☆☆ | 容斥原理 |
GCD Again | ★★☆☆☆ | 容斥原理 |
GCD | ★★☆☆☆ | 容斥原理 |
GCD | ★★☆☆☆ | 容斥原理 |
Coprime | ★★★☆☆ | 二分枚举+容斥原理 |
Sky Code | ★★★☆☆ | 容斥原理 |
7、大素数判定
题目链接 | 难度 | 解法 |
---|---|---|
GCD & LCM Inverse | ★★★☆☆ | 拉宾米勒大数判素+dfs |
Pseudoprime numbers | ★★★☆☆ | 拉宾米勒 |
Problem about GCD | ★★★★☆ | 拉宾米勒 |
Prime Test | ★★★★☆ | 拉宾米勒+Pollard-rho |
RSA | ★★★★☆ | 拉宾米勒 + 线性同余 |
8、离散对数-Baby Step Gaint Step算法
题目链接 | 难度 | 解法 |
---|---|---|
Discrete Logging | ★★★☆☆ | 基础 |
Mod Tree | ★★★★☆ | 扩展Baby Step Giant Step |
Matrix Puzzle | ★★★★★ | Baby Step Giant Step + 高斯消元 |
9、其它
题目链接 | 难度 | 解法 |
---|---|---|
Can you find it | ||
GCD of Sequence | ||
Sum Of Gcd | ||
GCD Array | ||
GCD pair | ||
GCD | ||
Gcd and Lcm | ||
The sum of gcd | ||
GCD?LCM! |