题解:
本题主要是两个重要结论:
- 一个数除以1~n的所有数向下取整的结果最多只有 n \sqrt n n种(目前本菜鸡还不会证,不过我估计不久我就会证了)
- 得到1性质中结果相等的一段可以这样如代码中标记的那行做(证明方法也不太严谨)
然后简单转化: k k k m o d mod mod i = k − ⌊ k i ⌋ × i i=k-\lfloor \frac{k}{i} \rfloor \times i i=k−⌊ik⌋×i,用等差数列求和方法就可以 O ( n ) O(\sqrt n) O(n)解出此题
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
long long n,k,ans,r,nowv;
int main()
{
cin>>n>>k;
for(long long l=1;l<=n;l=r+1){
nowv=k/l; /*标记处*/
if(!nowv)
r=n; /*防除0错*/
else
r=min(n,k/nowv); /*标记处*/
long long len=r-l+1,he=(len*(l+r))/2;
ans+=k*len-nowv*he;
}
cout<<ans<<endl;
return 0;
}