牛客编程巅峰赛S1第4场——B:浅尝辄止

题目描述:

在这里插入图片描述
示例:
牛客编程巅峰赛S1第4场——B:浅尝辄止_第1张图片

解题思路:

这道题不能暴力求,会超时。这个考查了整除分块的知识点。是数论的知识。(n/i)的值呈现块状分布,每一个分块最后的一位,能推导出来是n/(n/i),我们求和,只需要将n/i这个数值乘这个数值出现的次数即可。
整除分开的模板:

ans = 0;
for(int l = 1, r; l <= n; l = r + 1)
{
    r = n / (n / l);
    ans += n / l * (r - l + 1);
}

参考代码:

   public static int work (long n) {

        long sum=0;
        long k=998244353;
        long r;
        for(long i = 1; i <= n; i = r + 1)//每次循环从算出的r的下一位开始
        {
            r = n / (n / i);//相同块最后的一个位置的数是r
            sum += n / i * (r - i + 1);//每一块有r-i+1个,(因为从1开始推算的,比如一开始第一块只有一个数值。那么个数就是算出来的r=1 1-i i=1  然后再加1,算出来总共的个数,n/i是数值)
        }

        return (int) (sum%k);
    }

你可能感兴趣的:(比赛)