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

A Tree IV
分层做,每层节点数确定,节点编号也确定,对节点编号进行等差数列求和,再乘以当前层的深度即可。

B 牛牛组数
贪心,设分为k个数,显然k-1个数只有一位时,可以使得最终结果的位数尽量多,同时这k-1个数尽量小时,可保证最大的那一个数的高位数字尽可能大。

通过数组将存下1-9的个数,从小往大给k-1个数赋值,这部分也可以直接用一个int变量累加,因为和没多大。剩下的一个数就是从大到小把剩余的1-9给摆好。

然后就是大数加法,将该int变量作为进位,加一下,得到答案。

C 牛牛算题
因为数字太大,加上题目给出的算式形式,很容易联想到整除分块。然后的问题就是块内怎么做到快速计算。

最快的思路,遇事不决先打表。。。输出n为50或100时,p从1到100的k和m,发现k与我们整除分块的结论一致,块内的m则呈现等差数列的形式,且差为k。那么块内就可以通过等差数列求和O(1)求出了。

代码:

const int mod=1e9+7;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回1-n的所有k*m的和
     * @param num long长整型 正整数 n
     * @return long长整型
     */
    long long cowModCount(long long num) {
        // write code here
        long long ans=0;
        for(long long pl=1,pr,k,ml,mr;pl<=num;pl=pr+1){
            k=num/pl;//块内的k
            pr=num/k;//块内最大的p
            ml=num%pl,mr=num%pr;//块内m的首项和末项
            //等差数列求和,首项末项已知,项数为(r-l+1)
            ans=(ans+(ml+mr)*1ll*(pr-pl+1)/2%mod*k%mod)%mod;
        }
        return (ans%mod+mod)%mod;
    }
};
全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务