题意:

给你一个数字 图片说明 ,求 图片说明

解法一(暴力求解,不可AC):

直接循环图片说明 按题意计算过去即可。
代码:

class Solution {
public:
    const int mod=998244353;
    int work(long long n) {
        int ans=0;
        for(long long i=1;i<=n;i++){//注意开 long long
            ans=(ans+n/i)%mod;
        }
        return ans;
    }
};

时间复杂度:图片说明 ,程序中有一个图片说明 的循环,故时间复杂度为图片shou'x说明
空间复杂度:图片说明 ,程序中没有使用额外的数组,也没有递归调用的过程,只有有限个变量,故空间复杂度为图片说明

解法二(数论分块):

我们首先介绍一下数论分块。
数论分块一般用来计算如下形式的值
图片说明
而本题求解的问题就是数论分块的基本形式。
对于任意的 图片说明 ,存在一个区间图片说明 使得区间内的图片说明 值都相等。
例如,图片说明 时:
图片说明

引理:

对于任意一个 图片说明 ,满足上述的图片说明

证明:

对于满足图片说明 有:
图片说明
则:
图片说明
图片说明
故:
图片说明
图片说明 的最大值为图片说明
具体的,对于每一个区间的左端点图片说明 ,我们可以求出当前区间的右端点图片说明 ,然后我们程序就可以分区间进行计算了。
代码:

class Solution {
public:
    const int mod=998244353;
    int work(long long n) {
        int ans=0;
        //i为左端点,j为右端点,每次计算完后跳到下一个区间,即i=j+1
        for(long long i=1,j=0;i<=n;i=j+1){
            j=n/(n/i);//计算右端点
            ans+=1ll*(j-i+1)*(n/i)%mod;
            ans%=mod;
        }
        return ans;
    }
};

时间复杂度:图片说明
关于数论分块,我们以下给出时间复杂度的证明
我们可以考虑有多少个不同的图片说明

  1. 图片说明时,最坏情况每个图片说明 都不相同,最多只有图片说明 个不同的图片说明
  2. 图片说明 时,显然图片说明 ,故最多只有图片说明 个不同的图片说明
    综上所述,我们最多只有图片说明 个不同的图片说明 ,而相同的图片说明 一定在连续的一段区间内,我们可以图片说明 计算这段区间的答案,故总的时间复杂度为图片说明

空间复杂度:图片说明 ,程序中没有使用额外的数组,也没有递归调用的过程,只有有限个变量,故空间复杂度为图片说明