题意:传送门
题解:
k
%
i
=
k
−
⌊
k
i
⌋
∗
i
k\%i=k-\left \lfloor {\frac{k}{i}} \right \rfloor*i
k%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
对于这个
⌊
k
i
⌋
\left \lfloor {\frac{k}{i}} \right \rfloor
⌊ik⌋的问题是一个整除分块问题,这个证明非常巧妙传送门
之后这个算法的复杂度就降为
O
(
k
)
O(\sqrt{k})
O(k)
c
o
d
e
:
code:
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,ans;
int main()
{
cin>>n>>k;
ans=n*k;
for(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)/2ll;
}
cout<<ans<<endl;
return 0;
}