求 sigma(k-i*[k/i])(1<=i<=n) =k*n-sigma(i*[k/i])(1<=i<=n)
即关键求 sigma(i*[k/i]);
具体看代码:注意n,m的范围有可能超过int 。用long long 保存就可以了
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
int binarySeach(LL l,LL r,LL tem,LL k)
{
LL mid=l, ret=l;
while(l<=r)
{
mid=(l+r)>>1;
if((k/mid)>=tem)
{
l=mid+1;
ret=mid;
}
else
{
r=mid-1;
}
}
return ret;
}
int main()
{
LL n,m,i,j,k,tem,mid;
scanf("%lld%lld",&n,&k);
LL ans=n*k-k;
tem=2;
for(i=k/tem;i>=1&&tem<=n;i=k/tem)
{
mid=binarySeach(1,n,i,k);
if(mid>n)mid=n;
ans-=i*(mid+tem)*(mid-tem+1)/2;
tem=mid+1;
}
printf("%lld\n",ans);
return 0;
}