版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugar_free_mint/article/details/82025516
题目
给定 和 ,求
分析
因为 ,所以最终答案=
因为还是会超时,所以要用一种分块的思想,
设
且
然后用等差数列求答案即可
代码
#include <cstdio>
#include <algorithm>
long long n,k,ans;
int main(){
scanf("%lld%lld",&n,&k); ans=n*k;
for (register long long x=1,gx;x<=n;x=gx+1){
gx=k/x?std::min(k/(k/x),n):n;//有约数为x
ans-=(k/x)*(x+gx)*(gx-x+1)>>1;//等差数列
}
printf("%lld",ans);
return 0;
}