分析:注意到%的意义,n%i=n-[n/i]*i,所以F(n)=n^2-∑[n/i]*i,后面一项可以分块做,对i从1到sqrt(n)直接求,然后对后面的枚举[n/i],用等差数列求和。
1 #include<stdio.h> 2 #include<math.h> 3 typedef long long ll; 4 const int mod=1000000007; 5 ll test(ll n){ 6 ll sum=0; 7 for(ll i=1;i<=n;i++){ 8 sum=(sum+n%i)%mod; 9 } 10 return sum; 11 } 12 int main(){ 13 ll n; 14 while(scanf("%lld",&n)!=EOF){ 15 ll sum=0; 16 ll q=sqrt(n),a,b; 17 for(ll i=1;n/i>q;i++){ 18 sum=(sum+n/i*i)%mod; 19 } 20 for(ll k=1;k<=q;k++){ 21 a=(n/(k+1)+1)%mod;b=(n/k)%mod; 22 sum=(sum+((k*500000004)%mod)*(((a+b)*(b-a+1))%mod))%mod; 23 } 24 ll ans=(n%mod)*(n%mod)-sum; 25 ans=(ans%mod+mod)%mod; 26 // printf("%lld %lld ",ans,test(n)); 27 printf("%lld ",ans); 28 } 29 return 0; 30 }