P8219 [WFOI - 02] I wanna a feasitor(化验器) 题解
P8219 [WFOI - 02] I wanna a feasitor(化验器)题解
题目大意
给出 \(l, r\),求 \(\max{f(x)[l\le x\le r]}\),\(f(x)\)表示不为 \(x\) 的 \(x\) 的最大公约数。
Solution
- \(x\) 为偶数时就是 \(f(x)=x/2\)。
- \(x\) 为奇数时 \(f(x)\) 要么是 \(1\) 要么是 \(x/d\), \(d\) 一定是大于 2 的, \(d\) 是对于 \(x\) 来说最小的不为 1 的因数。
要让一个数的最大公约数最大就要让这个数最大,那么就只需要看 \(r\)。
-
如果 \(r\) 是奇数,那么 \(r-1\) 就是偶数, 显然\(f(r-1)\) 函数值会大于 \(f(r)\)。
-
如果 \(r\) 是偶数,那么 \(r-1\) 就是奇数, 显然\(f(r)\) 函数值会大于 \(f(r-1)\)。
于是就有 \(O(1)\) 了。
Code:
/*
Writer: ZhengXiangYu
*/
#include <bits/stdc++.h>
using i64 = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
i64 l, r;
std::cin >> l >> r;
if (r % 2 == 0) {
std::cout << r / 2 << "\n";
} else {
std::cout << (r - 1) / 2 << "\n";
}
return 0;
}