给定一个正整数n,求(sum_{i=1}^{n}{left[ frac{n}{i} ight]}),式子中[x]为下取整。答案可能会很大,输出答案对998244353取模后的值。
链接:https://ac.nowcoder.com/acm/contest/6221/B
来源:牛客网
这个题直接暴力是做不来的。
我们先举一个例子:10,它的所有结果是10 5 3 2 2 1 1 1 1 1。
我们能够看到有相当一部分的数是重复的,那这样的话我们能不能通过找到每一段数并且直接用求和公式来解决这个问题呢?
我们从最左端的数开始(设 l = 1,l代表左端点, r代表右端点)(因为n / 1 == n,故最左端的数一定是n),每次计算出 n / l 的值,这个值是当前位置的结果值,然后再用n除以这个数,r = n / (n / l)就能获得右端点的位置,然后直接计算整段值,再将l置为 r + 1 即下一段的左端点。
class Solution {
public:
/**
*
* @param n long长整型
* @return int整型
*/
int work(long long n) {
const int p = 998244353;
typedef long long ll;
ll res = 0;
for(ll l = 1, r;l <= n; l = ++r){
r = n / (n / l);
res += (n / l) % p * (r - l + 1) % p;
}
return res % p;
}