题目

给定一个正整数 ,求 。式子中 为下取整。
输出答案对 998244353 取模后的值。

解题思路

整除分块

以 10 为例:

1 2 3 4 5 6 7 8 9 10
10 5 3 2 2 1 1 1 1 1

表中同样的值会连续出现,可根据不同的数值划分出不同的分块。

假设已知某个分块的左端点 ,求出右端点 ,则有
,则
范围 内的数值都相等,即为

C++代码

class Solution {
public:
    /**
     * 
     * @param n long长整型 
     * @return int整型
     */
    int work(long long n) {
        // write code here
        int mod = 998244353;
        long long ans = 0;
        long long left = 1;
        long long right;
        while(left <= n){
            long long k = n / left;
            right = n / k;
            ans += (right - left + 1) * k;
            ans %= mod;
            left = right + 1;
        }
        return (int)ans;
    }
};