题解:LGP11397 界分数
题目描述
定义 \(f(x)\):
-
有一个分数 \(\frac{0}{x}\),\(f(x)\) 为以下操作的最小次数,直到这个分数为 \(1\):
-
分子 \(+1\),然后约分为最简形式。
-
分子分母同时 \(+1\),然后约分为最简形式。
-
给定正整数 \(n\),\((n\le10^{18})\),求 \(\sum\limits_{i=1}^{n} f(i) \mod 998244353\)。
思路
毕竟是 Ad-hoc 题,考的就是思维发散性。
先根据题目,做出一些合理的猜想。例如,贪心地让这个分数每次约掉一个 \(2\),代入样例发现是对的。那么约掉其他的数行不行呢?这时候就假设这个猜想是最优解,然后尝试去证明它。当然这个猜想要合理,不能胡编乱造,要有一定直觉。
结论:首先 \(+1\) 变成 \(\frac{1}{x}\),然后接下来,若分母是奇数,执行操作2,约去 \(2\),若分母是偶数,执行操作1,约去 \(2\)。一定能构成最优解。
以下的证明全部建立在 "首先 \(+1\) 变成 \(\frac{1}{x}\)" 的基础上。
证明:
-
设 \(g(x) = \lceil \log_2\frac{1}{x}\rceil\),定义域为 \([1,+\infty]\)。
-
显然 \(g\) 在定义域上单调递减。
-
假设某次操作之前是 \(i = \frac{a}{b}\),操作之后是 \(j = \frac{a+1}{b}\) 或 \(\frac{a+1}{b+1}\),
-
下证:\(g(i)-g(j)\le 1\),即每次操作后 \(g\) 的减量不超过 \(1\)。
-
\(\because \frac{a+1}{b}>\frac{a+1}{b+1}\),
-
\(\therefore g(\frac{a+1}{b}) < g(\frac{a+1}{b+1})\),
-
因此只需讨论 \(j=\frac{a+1}{b}\) 的情况。
-
考虑反证法:
-
假设 \(g(\frac{a}{b}) - g(\frac{a+1}{b}) > 1\)
-
\(\lceil \log_2\frac{b}{a}\rceil - \lceil \log_2\frac{b}{a+1}\rceil > 1\)
-
根据上取整的性质,不难得到,
-
\(\log_2\frac{b}{a} - \log_2\frac{b}{a+1} \ge 2\),
-
\(\log_2\frac{a+1}{a} \ge 2\),
-
\(a < \frac{1}{3}\),
-
然而根据题目以及 \(g\) 的定义域,\(a\) 是正整数,因此假设不成立。
-
-
综上,\(g(i)-g(j)\le 1\)。
-
-
注意到,\(g(x)=0\),当且仅当 \(x=1\),
-
因此,操作原来的分数 \(\frac{1}{x}\) 的过程,等价于将 \(g(\frac{1}{x})\) 变为 \(0\) 的操作次数相等的过程。
-
根据 "\(g\) 每次的减量不超过 \(1\)",那么可以构造最开始的结论的那种方案,使得 \(g\) 每次都减 \(1\),因此这种方案一定是最优解。
-
证毕。
于是操作次数就是 \(\lceil \log_2x\rceil + 1\)。\(1\) 即最开始的那一步。又根据上述证明,最开始的那一步一定是操作1,才能使 \(g\) 最小。
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const ll mod = 998244353;
ll n;
int main() {
cin >> n;
ll ans = 0;
for (ll l = 1, r = 1, cnt = 1; l <= n; l = r + 1, r = min(r << 1, n), cnt++) {
ans = (ans + (r - l + 1) % mod * cnt % mod) % mod;
}
cout << ans << '\n';
return 0;
}

浙公网安备 33010602011771号