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