import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
final int MOD = 1000000007;
long[] pow26 = new long[n + 1];
pow26[0] = 1;
for (int i = 1; i <= n; i++) {
pow26[i] = (pow26[i - 1] * 26) % MOD;
}
long sum = 0;
long dp0 = 1;
long dp1 = 0;
for (int m = 1; m <= n; m++) {
long newDp0 = (dp0 * 25) % MOD;
long newDp1 = (dp0 * 1 + dp1 * 25) % MOD;
if (m >= 2) {
long total = (pow26[m] - (newDp0 + newDp1)) % MOD;
if (total < 0) {
total += MOD;
}
sum = (sum + total) % MOD;
}
dp0 = newDp0;
dp1 = newDp1;
}
System.out.println(sum);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 预先计算幂次:通过数组pow26存储26的各次幂模1e9+7的结果,避免重复计算。
- 动态规划状态转移:dp0和dp1分别维护没有'u'和有'u'但没有's'的状态。每次迭代更新这两个状态。
- 累加结果:对于每个长度大于等于2的情况,计算该长度下包含子序列"us"的字符串数量,并累加到总和中。
- 处理负数情况:由于取模运算可能导致负数结果,通过加MOD确保结果非负。



京公网安备 11010502036488号