数学分块
按照k/i分成sqrt(n)块,块与块之间用等差数列算一算
/**************************************************************
Problem: 1257
User: syh0313
Language: C++
Result: Accepted
Time:20 ms
Memory:1288 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
long long n,k,ans,now;
int main()
{
scanf ( "%lld%lld" ,&n,&k);
if (n>=k) {ans=(n-k)*k; n=k;}
ans+=n*k;
//printf("%lld\n",ans);
for ( long long i=1;i<=n;)
{
long long l=i,r=k/(k/i);
//printf("%lld %lld %lld\n",l,r,(k/i)*(l+r)*(r-l+1)/2);
r=min(r,n);
ans-=(k/i)*(l+r)*(r-l+1)/2;
i=r+1;
}
printf ( "%lld\n" ,ans);
return 0;
}
|