EH's Blog

题目情境#

题目链接:https://www.luogu.com.cn/problem/P2261 ↗

题目描述

给出正整数 nn 和 kk,请计算

G(n,k)=∑i=1nk mod iG(n, k) = \sum_{i = 1}^n k \bmod i

其中 k mod ik\bmod i 表示 kk 除以 ii 的余数。

输入格式

输入只有一行两个整数,分别表示 nn 和 kk。

输出格式

输出一行一个整数表示答案。

输入 #1

10 5
plaintext

输出 #1

29
plaintext

对于 100%100\% 的数据,保证 1≤n,k≤1091 \leq n, k \leq 10^9。

算法解析:#

整除分块:⌊n/i⌋\lfloor n/i\rfloor 的取值只有 O(n)O(\sqrt n) 段,段 [l,r][l,r] 内值相同,其中 r=⌊n/⌊n/l⌋⌋r=\lfloor n/\lfloor n/l\rfloor\rfloor。对形如 ∑i=1nf(i)⋅⌊n/i⌋\sum_{i=1}^n f(i)\cdot\lfloor n/i\rfloor 的求和,可按段累加 ff 的区间和。复杂度 O(n)O(\sqrt n)。

image-20250808224555369

image-20250808224637154

c++代码#

#include<cstdio>
#include<algorithm>
using namespace std;

typedef long long LL;

int main(){
  LL n, k, l, r, res;
  scanf("%lld%lld", &n, &k);
  res = n*k;
  for(l=1; l<=n; l=r+1){
    if(k/l == 0) break;
    r = min(k/(k/l),n); 
    res -= (k/l)*(r-l+1)*(l+r)/2;
  }
  printf("%lld", res);
  return 0;
}
c
G19 整除分块
https://ehnotgod.site/zh/blog/g19-%E6%95%B4%E9%99%A4%E5%88%86%E5%9D%97
Author EH
Published at August 8, 2026