题解:LGP11397 界分数

LGP11397 界分数

题目描述

定义 \(f(x)\)

  • 有一个分数 \(\frac{0}{x}\)\(f(x)\) 为以下操作的最小次数,直到这个分数为 \(1\)

    1. 分子 \(+1\),然后约分为最简形式。

    2. 分子分母同时 \(+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;
}
posted @ 2025-02-03 12:57  chenwenmo  阅读(10)  评论(0)    收藏  举报