这题的题意就是求Σn%i (1<=i<=m)
根据整除的性质,我们可以把公式变形成n*m-Σi*(n/i) (这里的‘/‘表示整除的意思)
考虑n/i取整后,取值种数不超过根号n个,对于一段连续的数,n/i取整后值相同,显然我们可以用等差数列求和的方式来计算贡献。
这题还算是良心的,不用取模,不然还要考虑逆元之类的东西……
附上AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
long long n,m,ans,lim,l,r,t;
int main(void){
scanf("%lld%lld",&m,&n);
ans=n*m,lim=min(n,m),l=1;
while (l<=lim) t=n/l,r=min(n/t,lim),ans-=(l+r)*(r-l+1)/2*t,l=r+1;
printf("%lld\n",ans);
return 0;
}