欢迎大家访问我的老师的OJ———caioj.cn
题面描述
思路
∵
k
mod
i
=
k
−
⌊
k
/
i
⌋
∗
i
\because k ~\operatorname{mod}~{i}=k-\left\lfloor\ k/i \right\rfloor*i
∵k mod i=k−⌊ k/i⌋∗i,原问题转化为:
n
∗
k
−
∑
i
=
1
n
⌊
k
/
i
⌋
∗
i
\large n*k-\sum_{i=1}^{n}\left\lfloor\ k/i \right\rfloor*i
n∗k−i=1∑n⌊ k/i⌋∗i
对于
∀
x
∈
[
1
,
k
]
\forall x\in [1,k]
∀x∈[1,k],设
g
(
x
)
=
⌊
k
/
⌊
k
/
x
⌋
⌋
\operatorname{g}(x)=\left\lfloor\ k/ \left\lfloor\ k/x \right\rfloor \right\rfloor
g(x)=⌊ k/⌊ k/x⌋⌋,
显然,函数 f ( x ) = k / x f(x)=k/x f(x)=k/x单调递减,故 g ( x ) ≥ ⌊ k / ( k / x ) ⌋ = x \operatorname{g}(x)\ge \left\lfloor\ k/(k/x) \right\rfloor=x g(x)≥⌊ k/(k/x)⌋=x,转化得: ⌊ k / g ( x ) ⌋ ≤ ⌊ k / x ⌋ \left\lfloor\ k/\operatorname{g}(x) \right\rfloor\le\left\lfloor\ k/x \right\rfloor ⌊ k/g(x)⌋≤⌊ k/x⌋。
另外, g ( x ) ≤ k / ⌊ k / x ⌋ \operatorname{g}(x) \le k/\left\lfloor k/x \right\rfloor g(x)≤k/⌊k/x⌋,则 ⌊ k / g ( x ) ⌋ ≥ ⌊ k / ( k / ⌊ k / x ⌋ ) ⌋ = ⌊ k / k ∗ ⌊ k / x ⌋ ⌋ = ⌊ k / x ⌋ \left\lfloor\ k/\operatorname{g}(x) \right\rfloor\ge\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 ⌋ \therefore \left\lfloor\\ k/\operatorname{g}(x) \right\rfloor=\left\lfloor\\ k/x \right\rfloor ∴⌊k/g(x)⌋=⌊k/x⌋
故 ∀ i ∈ [ x , g ( x ) = ⌊ k / ⌊ k / x ⌋ ⌋ ] , ⌊ k / i ⌋ \forall i\in\big[x,\operatorname{g}(x)=\left\lfloor\ k/ \left\lfloor\ k/x \right\rfloor \right\rfloor\big],\left\lfloor k/i\right\rfloor ∀i∈[x,g(x)=⌊ k/⌊ k/x⌋⌋],⌊k/i⌋的值都相等.
∀ i ∈ [ 1 , k ] , ⌊ k / i ⌋ \forall i \in [1,k],\left\lfloor k/i\right\rfloor ∀i∈[1,k],⌊k/i⌋至多有 2 k 2\sqrt{k} 2k种取法
∵ \because ∵当 i < k i<\sqrt{k} i<k, i i i有 k \sqrt{k} k中取法,所以 ⌊ k / i ⌋ \left\lfloor k/i\right\rfloor ⌊k/i⌋至多有 k \sqrt{k} k种。
又当 i > k i>\sqrt{k} i>k, ⌊ k / i ⌋ \left\lfloor k/i\right\rfloor ⌊k/i⌋至多有 k \sqrt{k} k种。
所以最多有 2 k 2\sqrt{k} 2k种
最后用一下等差数列求和。
首项为 x x x,末项为 g ( x ) \operatorname{g}(x) g(x),公差为1.
再乘上个 ⌊ k / x ⌋ \left\lfloor k/x\right\rfloor ⌊k/x⌋就为所求。
AC code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
ll n,k,ans;
int main()
{
scanf("%lld%lld",&n,&k);ans=n*k;
ll gx;
for(int x=1;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\n",ans);
return 0;
}