牛客编程巅峰赛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;
         
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值