算法题:ID数量

注意

1.在何处取余不影响结果正确性?

对乘法和加法的运算表达式里取余都不会,因为有取模运算的分配律

(a * b) mod m = [(a mod m) * (b mod m)] mod m
(a * b) mod m = [(a mod m) * (b mod m)] mod m

2.不建立数组,用快速幂可以吗
快速幂也可以

题目描述

大学生小名设计了一种语言,他的语言最大支持N个字不同的字符,
并且他规定了由这些字符组成的ID,任何ID的长度需要大于等于1月小于等于L个字符,
他希望设计一个程序,计算他的语言总共能组成多少个ID

例如,当N=2(假设字符可以是0或1),并且L=3时,他具有如下的ID:{0,1,00,01,10,11,000,001,010,011,100,101,110,111},因此当N=2,L=3时总共有14种
ID。你需要编写一个程序,可以帮助小明找到可能的ID的总数

由于答案可能非常大,最后的结果需要对1000000007取余。

示例

输入

2 3
100 15
0 0

输出

14
979451521

Java解答

import java.util.Scanner;

public class CompilerLanguageIDCounter {
    private static final int MOD = 1000000007;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int N = scanner.nextInt();
            int L = scanner.nextInt();
            if (N == 0 && L == 0) {
                break;
            }
            System.out.println(countIDs(N, L));
        }
        scanner.close();
    }

    private static long countIDs(int N, int L) {
        // dp[i] 表示长度为 i 的ID的数量
        long[] dp = new long[L + 1];
        dp[1] = N; // 长度为1的ID有N个

        // 计算长度从2到L的所有ID数量
        for (int i = 2; i <= L; i++) {
            dp[i] = (dp[i - 1] * N) % MOD;
        }

        // 累加所有长度的ID数量
        long total = 0;
        for (long count : dp) {
            total = (total + count) % MOD;
        }

        return total;
    }
}
posted @ 2024-10-09 15:28  修子xiu1zi3  阅读(5)  评论(0编辑  收藏  举报