题目
给定 n n n和 k k k,求 ( k m o d    1 ) + ( k m o d    2 ) + … + ( k m o d    n − 1 ) + ( k m o d    n ) (k\mod1)+(k\mod2)+…+(k\mod n-1)+(k\mod n) (kmod1)+(kmod2)+…+(kmodn−1)+(kmodn)
分析
因为
(
k
m
o
d
  
n
)
=
k
−
⌊
k
÷
n
⌋
(k\mod n)=k-\lfloor k\div n\rfloor
(kmodn)=k−⌊k÷n⌋,所以最终答案=
n
×
k
−
∑
i
=
1
n
⌊
k
÷
i
⌋
×
i
n\times k-\sum_{i=1}^n\lfloor k\div i\rfloor\times i
n×k−i=1∑n⌊k÷i⌋×i
因为还是会超时,所以要用一种分块的思想,
设
g
(
x
)
=
⌊
k
÷
⌊
k
÷
x
⌋
⌋
g(x)=\lfloor k\div\lfloor k\div x\rfloor\rfloor
g(x)=⌊k÷⌊k÷x⌋⌋,那么
g
(
x
)
≥
⌊
k
÷
(
k
÷
x
)
⌋
=
x
g(x)\geq \lfloor k\div(k\div x)\rfloor=x
g(x)≥⌊k÷(k÷x)⌋=x
且
⌊
k
÷
g
(
x
)
⌋
≥
⌊
k
÷
(
k
÷
⌊
k
÷
x
⌋
)
⌋
=
⌊
k
÷
x
⌋
\lfloor k\div g(x)\rfloor\geq\lfloor k\div(k\div\lfloor k\div x\rfloor)\rfloor=\lfloor k\div x\rfloor
⌊k÷g(x)⌋≥⌊k÷(k÷⌊k÷x⌋)⌋=⌊k÷x⌋,所以
⌊
k
÷
g
(
x
)
⌋
=
⌊
k
÷
x
⌋
\lfloor k\div g(x)\rfloor=\lfloor k\div x\rfloor
⌊k÷g(x)⌋=⌊k÷x⌋
那么就可以用整除分块求解
然后用等差数列求答案即可
代码
#include <cstdio>
#include <algorithm>
long long n,k,ans;
int main(){
scanf("%lld%lld",&n,&k); ans=n*k;
for (register long long x=1,gx;x<=n;x=gx+1){
gx=k/x?std::min(k/(k/x),n):n;//有约数为x
ans-=(k/x)*(x+gx)*(gx-x+1)>>1;//等差数列
}
printf("%lld",ans);
return 0;
}