目錄
- 題目描述
- 示例
- 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;
}
}