51Nod1225 余数之和
数论好题
我们以前在做反演的时候,常常用到一个叫做分块除法的东西
具体来说,[n/i]只会有不超过√n种取值
那么这题也可以这样做 因为n%i=n-[n/i]*i
我们可以对i分块,对于[n/i]取值相同的一起计算,那么每次就是一个等差数列求和,总复杂度O(√n)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 1000000007
#define LL long long
using namespace std;
LL n,ans=0,inv=500000004;
int main(){
scanf("%lld",&n);
for(LLL i=1,j,k;i<=n;i=j+1){
k=n/i; j=n/k;
ans=(ans+n*(j-i+1)%M-k*(i+j)%M*(j-i+1)%M*inv%M+M)%M;
}
printf("%lld",ans);
}