∑i=1mnmodi=n∗m−∑i=1mn/i∗i
,由于
n/i
的值相同的是连续出现的,并且可以证明相同的值最多有
n√
个,所以可以直接分块搞。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define tt 1000000007
#define inv2 ((tt+1)/2)
using namespace std;
LL ans,n,m;
int main(){
freopen("remainders.in","r",stdin);
freopen("remainders.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(LL nxt,i=1;i<=min(n,m);i=nxt+1){
nxt=min(min(n,m),n/(n/i));
ans=(ans+(n/i)%tt*((i+nxt)%tt)%tt*((nxt-i+1)%tt)%tt*inv2%tt)%tt;
}
printf("%lld",((n%tt*(m%tt)%tt-ans)%tt+tt)%tt);
return 0;
}