链接:https://ac.nowcoder.com/acm/contest/9005/C
来源:牛客网
考虑 n/i 的 值能只有根号种,所以我们整除分块,将每一段区间计算出来,然后%的结果为一个等差序列。剩下的直接暴力求即可
牛牛的数学老师教会了牛牛除法,牛牛十分开心,他知道任意一个正整数都可以表示为n = p\times k + mn=p×k+m (kk 为商,mm为余数) 的方式,现在死脑筋的牛牛想要计算对于小于等于nn的每一个数p(p\geq 1)p(p≥1), 计算所有 k \times mk×m 的和。这可难倒了牛牛,请你来帮帮他吧。(由于答案可能过大,请对10^9+7
class Solution {
typedef long long ll;
ll l[1200000],r[1200000];
const ll mod=1e9+7;
#define rep(i,j,n) for(ll i=j;i<=n;i++)
#define per(i,j,n) for(ll i=j;i>=n;i--)
public:
long long cowModCount(long long num)
{
long long n=num;
ll p=sqrt(n);
ll ans=0;
rep(i,1,p)
{
l[i]=(n/(i+1))+1;
r[i]=(n/i);
ll len=(r[i]-l[i]+1);
ll a1=n%r[i];
ll d=i;
ll num=len*(a1+a1+(len-1)*d)/2;
num%=mod;
ans=(ans+i*num)%mod;
}
rep(i,1,l[p]-1)
{
ans=(ans+(n/i)*(n%i)) %mod;
ans%=mod;
}
return ans%mod;
}
};