牛客编程巅峰赛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; } };