Tree IV
题解
这道题总体来说较为简单,主要考察二叉树的性质,我们首先给出一个二叉树的编码图
如上所示,我们可以得到三个结论
- 每层的第一个结点值都为(2的上一层数的次方)。
- 每层的最后一个结点值为(2的当前层数的次方-1)。
- 每层结点和可以由等差数列求得。
通过上述三个结论,我们可以快速求出每层的结点和,因为我们可以通过求2的幂值,轻易得到等差数列的起点与终点,最终加和取余即可得到最后的结果。
代码
public static long mod = 998244353;
public static long tree4 (long n) {
// write code here
long cur = (long) Math.floor(log2(n)); //下取整 得到完美二叉树层数
long base = 2;
long ans = 0;
int i;
for(i = 1;i <= cur; i++){
ans += sum(base/2, base-1)*i;
base *= 2;
ans %= mod;
}
ans += sum(base/2, n)*i;
ans %= mod;
return ans;
}
public static long sum(long s, long e){
return ((s+e)*(e-s+1)/2)%mod;
}
public static long log2(long N) {
return (long) (Math.log(N)/Math.log(2));//Math.log的底为e
}
注意
- 由于在Java中log的底数是e,所以我们使用换底公式,来构造log2函数。
- 在取余的过程中,注意取余的分配律,避免取余失误。