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

posted @ 2022-03-19 19:48  落花月朦胧  阅读(49)  评论(0编辑  收藏  举报