結果
| 問題 |
No.260 世界のなんとか3
|
| コンテスト | |
| ユーザー |
htensai
|
| 提出日時 | 2020-02-10 19:50:03 |
| 言語 | Java (openjdk 23) |
| 結果 |
MLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 3,327 bytes |
| コンパイル時間 | 2,352 ms |
| コンパイル使用メモリ | 77,756 KB |
| 実行使用メモリ | 89,540 KB |
| 最終ジャッジ日時 | 2024-10-01 06:30:03 |
| 合計ジャッジ時間 | 15,156 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 6 MLE * 21 |
ソースコード
import java.util.*;
public class Main {
static final int MOD = 1000000007;
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int a = getDp(sc.next().toCharArray(), false);
int b = getDp(sc.next().toCharArray(), true);
System.out.println((b - a + MOD) % MOD);
}
static int getDp(char[] arr, boolean flag) {
int n = arr.length;
int[] each = new int[n];
for (int i = 0; i < n; i++) {
each[i] = arr[i] - '0';
}
int[][][][][] dp = new int[n + 1][3][8][2][2];
dp[0][0][0][1][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 8; k++) {
for (int l = 0; l < 10; l++) {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] += dp[i - 1][j][k][0][1];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] %= MOD;
if (l == 3) {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] += dp[i - 1][j][k][0][0];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] %= MOD;
} else {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][0] += dp[i - 1][j][k][0][0];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][0] %= MOD;
}
}
for (int l = 0; l < each[i - 1]; l++) {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] += dp[i - 1][j][k][1][1];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] %= MOD;
if (l == 3) {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] += dp[i - 1][j][k][1][0];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][1] %= MOD;
} else {
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][0] += dp[i - 1][j][k][1][0];
dp[i][(j + l) % 3][(k * 10 + l) % 8][0][0] %= MOD;
}
}
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][1] += dp[i - 1][j][k][1][1];
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][1] %= MOD;
if (each[i - 1] == 3) {
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][1] += dp[i - 1][j][k][1][0];
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][1] %= MOD;
} else {
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][0] += dp[i - 1][j][k][1][0];
dp[i][(j + each[i - 1]) % 3][(k * 10 + each[i - 1]) % 8][1][0] %= MOD;
}
}
}
}
int ans = 0;
for (int i = 1; i < 8; i++) {
ans += dp[n][0][i][0][0];
ans %= MOD;
for (int j = 0; j < 3; j++) {
ans += dp[n][j][i][0][1];
ans %= MOD;
}
if (flag) {
ans += dp[n][0][i][1][0];
ans %= MOD;
for (int j = 0; j < 3; j++) {
ans += dp[n][j][i][1][1];
ans %= MOD;
}
}
}
return ans;
}
}
htensai