『题解』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;
}
posted @ 2022-03-22 18:22  仙山有茗  阅读(68)  评论(0)    收藏  举报