题解 | #浅尝辄止#

浅尝辄止

http://www.nowcoder.com/practice/1603a21b5d7d489b8355734eec4e40e0

题意:

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

解法一(暴力求解,不可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. 图片说明 时,显然图片说明 ,故最多只有图片说明 个不同的图片说明
    综上所述,我们最多只有图片说明 个不同的图片说明 ,而相同的图片说明 一定在连续的一段区间内,我们可以图片说明 计算这段区间的答案,故总的时间复杂度为图片说明

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

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务