<!-- wp:paragraph -->
<p>不是这个段位的,跨个区凑个热闹。。
牛客编程巅峰赛S2第1场 - 钻石&王者
AB题是 牛客编程巅峰赛S2第1场 - 青铜&白银&黄金 记录&总结 中的BC题</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>C 牛牛算题</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>对$latex n$做带余除法,$latex k$为商,$latex m$为余数。
$latex n=p*k+m,\quad p=1,\dots,n$
求$latex \sum_p k\cdot m \, \rm{mod} (10^9+7)$</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>就是朴素的思路。。所以时间不是很快,达到10ms了,其他人的解法我没大看懂。。
第一次把p,k对称的部分加上,同时记录哪些已经算过了。
第二次把剩下的,用等差数列求和计算加上去。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
      返回1-n的所有km的和
     * @param num long长整型 正整数 n
     * @return long长整型
     */
    typedef long long LL;
    const LL Mod=1e9+7;
    long long cowModCount(long long num) {
        // write code here
        LL sum=0,m=floor(sqrt(num));
        LL vec[2*m],tmp;
        for(LL i=1;i<=m;i++){
            tmp=num/i;
            vec[i-1]=i;
            vec[2*m-i]=tmp;
            if(tmp!=i){
                sum+=(i+tmp)*(num%i)%Mod;
            }else{
                sum+=(i)*(num%i)%Mod;   
            }

            sum%=Mod;
        }
        LL count=0; 
        for(LL i=2*m-1;i>=1;i--){
            if(vec[i]==vec[i-1]||vec[i]==vec[i-1]+1){
                count++;
                continue;   
            }else{
                count++;
            }
            LL a=num%(vec[i-1]+1),b=num%(vec[i]-1);
            LL p=(a+b)(vec[i]-vec[i-1]-1)/2count%Mod;
            sum+=p;
            sum%=Mod;
        }
        return sum;
    }
};

<!-- /wp:code -->

最后修改:2020 年 12 月 22 日 07 : 03 PM
如果觉得我的文章对你有用,请随意赞赏