思路:
考虑取模的原理:
k%n=k−k/i∗i
如果你对莫比乌斯反演中的分块很熟悉的话,那么你一眼就能看出来:k/i的值最多只有2*sqrt(k)个,所以我们只需sqrt(n)的时间就可以完成。而且i的前缀和也不需要预处理,直接公式就有了。
#include<stdio.h>
#include <iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#define eps 1e-8
typedef long long int lli;
using namespace std;
const int maxn = 1e6+10;
int main(){
lli p,q;
lli a,b,k,n;
scanf("%lld%lld",&n,&k);
lli ans = n*k,l,len = min(n,k);
for(lli i = 1;i <= len;i=l+1){
l = min(k/(k/i),len);
ans += -(k/i)*((l+i)*(l-i+1)/2);
}
printf("%lld\n",ans);
return 0;
}