演算法題:ID數量

修子xiu1zi3發表於2024-10-09

目錄
  • 題目描述
  • 示例
  • Java解答

注意

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;
    }
}

相關文章