计算方法参考了http://blog.youkuaiyun.com/racebug2010/article/details/6090801
这里比较有意思的小技巧是算出和i计算k/i结果相同的最大的j值
d=k/i,j=k/d因为k%i可能存在余数,而j=k/d求出的则是满足k%j==0的j值
对于x属于[i,j]范围内,k%x的值逐渐减小(是按k/i为公差成等差数列直到0).
所以对于x属于区间[i,j],所有y(y=d/x)值相同。
#include <cstdio>
using namespace std;
typedef long long LL;
int main()
{
LL n,k;
while(~scanf("%I64d%I64d",&n,&k)){
LL ans=n*k;
if(n>k) n=k;
for(LL i=1;i<=n;){
LL d=k/i;
LL j=k/d;
if(j>n) j=n;
ans-=d*(i+j)*(j-i+1)/2;
i=j+1;
}
printf("%I64d\n",ans);
}
return 0;
}