【链接】
bzoj1257
【解题报告】
n mod m = n−n∗nm
所以就想到了分块,将 nm 相同的分成一个块。
然后对于每个块求一遍等差数列就行了。
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int n,m,S;
LL ans;
int main()
{
freopen("1257.in","r",stdin);
freopen("1257.out","w",stdout);
scanf("%d%d",&m,&n); S=sqrt(n); ans=0;
if (m>n) ans+=(LL)(m-n)*n,m=n;
for (int i=1; i<=S&&i<=m; i++) ans+=n%i;
if (m<=S) return printf("%lld",ans),0;
for (int i=1; i<=S; i++)
{
int L=n/(i+1)+1,R=n/i;
if (L<S+1) L=S+1; if (R>m) R=m;
if (L>R) continue;
ans+=(LL)(n%L+n%R)*(R-L+1)/2;
}
printf("%lld",ans);
return 0;
}