纪中21日T3 2118. 最大公约数
(File IO): input:gcd.in output:gcd.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
给出两个正整数A,B,求它们的最大公约数。
输入
第一行一个正整数A。
第二行一个正整数B。
输出
在第一行输出一个整数,表示A,B的最大公约数。
样例输入
18 24
样例输出
6
数据范围限制
在40%的数据中,1 ≤ A,B ≤ 10^6
在60%的数据中,1 ≤ A,B ≤ 10^18
在80%的数据中,1 ≤ A,B ≤ 10^100
在100%的数据中,1 ≤ A,B ≤ 10^1000
Solution
Algorithm1
正常的gcd(a,b)=gcd(b,a%b);
开unsigned long long可得六十分(应该不会超时)
Code1
#include #include #include #include #include #include
Attention1
函数也要开ULL(缩写)
别把“%”写成“-”,否则在相减前要先使得a>b
而且那样就变成更相减损法了
Algorithm2
gcd二进制法
先看看a,b是不是2的倍数
如果都是,gcd(a,b)=2*gcd(a/2,b/2);
如果a是,gcd(a,b)=gcd(a/2,b);
如果b是,gcd(a,b)=gcd(a,b/2);
如果都不是,gcd(a,b)=gcd(b,a%b)
最后一条=gcd(b,a-b)也可以
(为后面的高精度做铺垫)
Code2
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
Code2 Algorithm3
不压位的高精度
高精度求余数很麻烦(按位求会比较快)
套用更相减损法
同时特判:如果a,b小于19位,依然采用二进制的辗转相除。
Code3
Code3 由于是普通的更相减损,一旦数位超过20使用高精,速度就会很慢很慢很慢……
60分~80分不等
Algorithm4
高精压位
核心算法与Algorithm3相同
Code4
#include #include #include #include #include #include
Code4 Algorithm5
通过下面(最下面)的对拍发现,四种算法中,二进更相比普通更相更快(不是只有0.3毫秒么?)
高精(可以不压位)二进制更相减损术也不是很难打(而且判断也很快)
Impression
如果你有兴趣……
#pragma GCC optimize(2)#include #include #include #include #include #include
gcd.cpp #pragma GCC optimize(2)#include #include #include #include #include #include
gx.cpp #pragma GCC optimize(2)#include #include #include #include #include #include #include
gcdbin #pragma GCC optimize(2)#include #include #include #include #include #include #include
gxbin.cpp #pragma GCC optimize(2)#include #include #include #include #include #include
rand_gcd.cpp #pragma GCC optimize(2)#include #include #include #include #include #include
gcd对拍.cpp 1000组数据运算结果如下
End