题解:

数论

首先把n>k的部分特判

k%1+k%2+...+k%n=nk-int(k/i)*i(1<=i<=k)

然后对于每一个k/i,一段一段求

容易发现只有sqrt(n)个

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,k,ans1,ans2,t,r;
int main()
{
    scanf("%d%d",&n,&k);
    ans1=n*k;
    if (n>=k)n=k;
    for (int i=1;i<=n;i=r+1)
     {
         t=k/i;r=k/t;
         if (r>n)r=n;
         ans2+=t*(i+r)*(r-i+1)/2;
     }
    printf("%lld\n",ans1-ans2); 
    return 0;
}

 

posted on 2017-12-15 17:50  宣毅鸣  阅读(119)  评论(0编辑  收藏  举报