CF664A Complicated GCD
Description
给定 \(a\),\(b\),求出 \(gcd(a, a + 1, a + 2, ..., b)\)。
Constraints
\(1 \le a,b \le 10^{100}\)
Solution
初看题目,感觉真是大水题,暴力就 完 了(一语双关)
由于 \(a\),\(b\) 过大,不能直接暴力,况且这是CF的题,需要一些数学技巧。
先考虑两个数 \(n\),\(n + k\) 在什么时候有最大公约数:
设它们最大公约数中有一个质数因子为 \(p\),则有 \(n \%\ p = 0\),\((n + k) \%\ p = 0\)。
那么只有当 \(k\) 为 \(p\) 的倍数时才会成立,所以 \(k \ge p\)
又因为质数 \(p \ge 2\),所以我们得出一个结论: \(gcd(a, a + 1) = 1\)。
回到这题,不难得出当且仅当 \(a = b\) 时,输出 \(a\),否则输出 \(1\) 即可。
Code
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define rep(_, __, ___) for(int _ = __; _ <= ___; _++)
#define per(_, __, ___) for(int _ = __; _ >= ___; _--)
using namespace std;
string a, b;
int main()
{
cin >> a >> b;
if(a == b) cout << a;
else cout << "1";
return 0;
}