牛客编程巅峰赛S2第1场 - 钻石&王者 C牛牛算题

链接: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;
         
    }
};

你可能感兴趣的:(牛客编程巅峰赛S2第1场 - 钻石&王者 C牛牛算题)