直接按取整相同的数分块就可以了,可以证明不会大于sqrt(n)块。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
long long n,k,pos;
long long ans;
int main()
{
scanf("%lld%lld",&n,&k);
long long tmp=min(n,k-1);
for(int i=1;i<=tmp;i=pos+1)
{
pos=min(k/(k/i),tmp);
ans+=k*(pos-i+1)-(k/pos)*(pos+i)*(pos-i+1)/2;
}
if(n>k)
{
ans+=(n-k)*k;
}
printf("%lld",ans);
return 0;
}
本文介绍了一种通过取整相同数分块的方法来优化计算过程,并证明了这种方法最多需要sqrt(n)块。通过实例代码展示应用过程,实现效率提升。
427

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



