题目
给定一个正整数 ,求 。式子中 为下取整。
输出答案对 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; } };