题目
https://www.luogu.org/problemnew/show/P2261
解题思路
我们注意到
k
m
o
d
i
=
k
−
⌊
k
i
⌋
∗
i
k\ mod\ i=k-\left \lfloor \frac{k}{i} \right \rfloor*i
k mod i=k−⌊ik⌋∗i,可以转换成
n
∗
k
−
∑
i
=
1
n
⌊
k
i
⌋
∗
i
n*k-\sum_{i=1}^{n}\left \lfloor \frac{k}{i} \right \rfloor*i
n∗k−i=1∑n⌊ik⌋∗i
对于任意整数
x
∈
[
1
,
k
]
x\in \left [ 1,k \right ]
x∈[1,k],设
g
(
x
)
=
⌊
k
÷
⌊
k
x
⌋
⌋
g(x)=\left \lfloor k\div \left \lfloor \frac{k}{x} \right \rfloor \right \rfloor
g(x)=⌊k÷⌊xk⌋⌋。所以
g
(
x
)
≥
⌊
k
÷
k
x
⌋
=
x
g(x)\geq \left \lfloor k\div \frac{k}{x} \right \rfloor=x
g(x)≥⌊k÷xk⌋=x,故
⌊
k
÷
g
(
x
)
⌋
≤
⌊
k
/
x
⌋
\left \lfloor k\div g(x) \right \rfloor\leq \left \lfloor k/x \right \rfloor
⌊k÷g(x)⌋≤⌊k/x⌋。
另外
⌊
k
/
g
(
x
)
⌋
≥
⌊
k
/
(
k
/
⌊
k
/
x
⌋
)
⌋
=
⌊
k
/
k
∗
⌊
k
/
x
⌋
⌋
=
⌊
k
/
x
⌋
\left \lfloor k/ g(x) \right \rfloor\geq \left \lfloor k/(k/\left \lfloor k/x \right \rfloor) \right \rfloor =\left \lfloor k/k*\left \lfloor k/x \right \rfloor \right \rfloor =\left \lfloor k/x \right \rfloor
⌊k/g(x)⌋≥⌊k/(k/⌊k/x⌋)⌋=⌊k/k∗⌊k/x⌋⌋=⌊k/x⌋故
⌊
k
/
g
(
x
)
⌋
=
⌊
k
/
x
⌋
\left \lfloor k/g(x) \right \rfloor=\left \lfloor k/x \right \rfloor
⌊k/g(x)⌋=⌊k/x⌋可得
∀
i
∈
[
x
,
⌊
k
÷
⌊
k
x
⌋
⌋
]
,
⌊
k
/
i
⌋
的
值
相
等
。
\forall i \in \left [ x,\left \lfloor k \div \left \lfloor \frac{k}{x} \right \rfloor \right \rfloor \right ],\left \lfloor k/i \right \rfloor的值相等。
∀i∈[x,⌊k÷⌊xk⌋⌋],⌊k/i⌋的值相等。
如果还不懂,可以参考 https://www.luogu.org/problemnew/solution/P2261
代码除数分块
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll n,k,ans;
int main(){
scanf("%lld%lld",&n,&k); ans=n*k;
for(register int x=1,gx;x<=n;x=gx+1){
gx=k/x?min(k/(k/x),n):n;
ans-=(k/x)*(x+gx)*(gx-x+1)/2;
}
printf("%lld",ans);
}

本文详细解析了洛谷平台上的P2261题目,通过数学推导和算法优化,提供了高效的解题思路。介绍了如何利用除数分块的方法减少计算复杂度,给出了解题代码。
685

被折叠的 条评论
为什么被折叠?



