题解:
这题做过好几次,只要对于除值相同的部分进行分块,一块一块处理就好了啊。。。
代码如下(51nod版本):
#include<cstdio>
#include<string>
using namespace std;
const int tt=1000000007,inv2=(tt+1)/2;
long long n,m,ans;
long long sum(long long l,long long r){
return ((((l+r)%tt)*((r-l+1)%tt)%tt)*inv2)%tt;
}
int main(){
scanf("%lld",&n); m=n;
ans=((n%tt)*(m%tt))%tt;
long long nxt=0;
for (long long i=1;i<=min(n,m);i=nxt+1){
nxt=n/(n/i); nxt=min(nxt,min(n,m));
ans=(ans+tt-(((n/i)%tt)*(sum(i,nxt)%tt))%tt)%tt;
}
printf("%lld\n",ans);
return 0;
}