『题解』Luogu P8219 [WFOI - 02] I wanna a feasitor(化验器)
题目大意
定义一个函数 \(f(x)\),它表示除 \(x\) 本身之外,\(x\) 的最大约数(\(x\) 为大于 \(1\) 的正整数)。
例如:
- \(f(8)=4\):\(8\) 的约数有 \(1,2,4,8\),除 \(8\) 本身之外最大的约数为 \(4\)。
- \(f(15)=5\):
现给定 \(l,r\),求 \(\max\limits^{r}_{i=l}\{f(i)\}\)。
思路
首先,可以发现偶数一定能被 \(2\) 整除,且最大除本身外约数就是这个数除以 \(2\)。
下面举几个例子:
- \(12\):约数有 \(1,2,3,4,6,12\),除本身外最大约数是 \(6\),也是 \(\dfrac{12}{2}\)。
- \(20\):约数有 \(1,2,4,5,10,20\),除本身外最大约数是 \(10\),也是 \(\dfrac{20}{2}\)。
- \(34\):约数有 \(1,2,17,34\),除本身外最大约数是 \(17\),也是 \(\dfrac{34}{2}\)。
奇数就不一样,例如 \(15\),\(f(15)=5\),而比它大的偶数 \(16\) 的最大除本身外约数是 \(8\),比 \(f(15)\) 大。
那么观察一下连续的一段序列,要求 \(f(x)\) 最大值,那么这个 \(x\) 一定在区间的末尾,且不是奇数。
所以答案就是『区间最大的偶数除以 \(2\)』。
还有,题目背景说了——开 long long。
比赛时在做什么?有没有空?可以来开 longlong 吗?
由于万能的 C++ 除法自带向下取整,所以直接输出 \(\dfrac{r}{2}\) 即可。
代码
#include <iostream>
using namespace std;
long long l,r;
int main(){
cin >> l >> r;
cout << r/2 << endl;
return 0;
}

浙公网安备 33010602011771号