题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=508
题解:这是一道数学规律题,经过打表我们可以发现商相等的情况下呈现等差数列,公差就是商,这样我们就可以缩短时间去计算;
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL n,k;
while(~scanf("%lld%lld",&n,&k))
{
LL Dl,Dr,r,l,ans = 0;
if(n >= k)
{
ans += (n - k) * k;
for(LL i = 1; i*i <= k; i++)
{
l = k / i,r = k / (i+1) + 1;
Dl = k % l,Dr = k % r;
ans += (Dl + Dr)*(l - r + 1)/2;
}
for(LL i = r-1; i >= 1; i--)
ans += k%i;
}
else
{
for(LL i = 1; i*i <= n; i++)
{
l = k / i,r = k / (i+1) + 1;
if(n >= r)
{
l = min(l,n);
Dl = k % l,Dr = k % r;
ans += (Dl + Dr)*(l - r + 1)/2;
}
}
for(LL i = r-1; i >= 1; i--)
if(i <= n)
ans += k%i;
}
printf("%lld\n",ans);
}
}