题目:
Good Num的定义:数字下标从0开始,偶数下标处的数字都是偶数;奇数下标处的数字都是质数。
现给定整数k,求解长度为k且是Good Num的数的数量。结果对10^9+7取模。
保证输入的都是正整数并且需要考虑前导0。
主要思路:
根据Good Num的定义,我们可以将一个Good Num看作是由若干个偶数和若干个质数交替排列而成的。
假设长度为k的Good Num中有x个偶数和y个质数,那么偶数下标处的数字就有x个,奇数下标处的数字就有y个。因此,我们可以将问题转化为从5个偶数和4个质数中分别选出x个和y个的方案数,然后将方案数相乘即可得到总方案数。
由于x和y的取值范围较大,因此我们需要使用大整数类BigInteger来进行计算。另外,为了避免计算过程中的溢出问题,我们可以使用快速幂算法来计算方案数并对MOD取模。
import java.math.BigInteger;
import java.util.Scanner;
public class GoodNum {
// 定义一个常量MOD,表示取模的值
private static final int MOD = 1000000007;
// 快速幂算法,计算a的b次方并对MOD取模
private static long pow(long a, BigInteger b) {
long ans = 1;
while (b.compareTo(BigInteger.ZERO) > 0) {
if (b.mod(BigInteger.valueOf(2)).equals(BigInteger.ONE)) {
ans = (ans * a) % MOD;
}
a = (a * a) % MOD;
b = b.divide(BigInteger.valueOf(2));
}
return ans;
}
// 计算长度为k且是Good Num的数的数量
private static int countGoodNum(BigInteger k) {
// 计算偶数下标处的数字的数量
BigInteger even = (k.add(BigInteger.ONE)).divide(BigInteger.valueOf(2));
// 计算奇数下标处的数字的数量
BigInteger odd = k.divide(BigInteger.valueOf(2));
// 计算偶数下标处的数字的方案数,即从5个偶数中选even个的方案数
long evenCount = pow(5, even);
// 计算奇数下标处的数字的方案数,即从4个质数中选odd个的方案数
long oddCount = pow(4, odd);
// 返回总方案数,即偶数下标处的数字的方案数乘以奇数下标处的数字的方案数
return (int) ((evenCount * oddCount) % MOD);
}
public static void main(String[] args) {
// 读入整数k
Scanner input = new Scanner(System.in);
BigInteger k = input.nextBigInteger();
// 计算长度为k的Good Num的数量并输出
System.out.println(countGoodNum(k));
input.close();
}
}