MT2202 Good Num 的数量

题目:
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();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值