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;
}

posted @ 2022-07-05 20:04  panjx  阅读(49)  评论(0编辑  收藏  举报