在一行上输入一个正整数
代表满二叉树的深度。
输出一个整数,代表深度为
的满二叉树中,长度为
的简单路径的数量。由于答案可能很大,请将答案对
取模后输出。
1
0
在这个样例中,深度为
的满二叉树只有
个节点,所以没有长度为
的简单路径。
3
7
在这个样例中,所给出的满二叉树如下图所示:
考规律题,重要的是要知道当二叉树高度>= 2时,路径总数s = 3 * pow(2 * 1.0, (n - 1) * 1.0) - 5。另外为防止数值溢出,收集i结果变量需要定为long型,且需要在每一次乘法后 % 1000000007,最后输出答案即可。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
final long mod = 1000000007;
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
if (n == 1){
System.out.println(0);
} else{
long res = 1;
for (int i = 0; i < n - 1; i++){
res *= 2;
res %= mod;
}
long s = (3 * res) % mod - 5;
System.out.println(s);
}
}
}
} import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws IOException {
// ((2^n - 1) * 3 -2 ) mod 100000007
int base = 1000000007;
long baseRemainder = (1 << 30) % base;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int deep = Integer.parseInt(bufferedReader.readLine()) - 1;
int len = deep / 30;
int less = deep % 30;
long remainder = 1;
for (int i = 0; i < len; i++) {
remainder = (remainder * baseRemainder) % base;
}
remainder = remainder * ((1L << less) % base);
remainder = (remainder - 1) * 3 % base;
System.out.println(remainder > 0 ? remainder - 2 : remainder);
}
} 为啥我没想到用BigInteger呢