結果
問題 | No.1417 100の倍数かつ正整数(2) |
ユーザー |
![]() |
提出日時 | 2024-07-23 10:33:25 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 106 ms / 3,000 ms |
コード長 | 2,715 bytes |
コンパイル時間 | 2,352 ms |
コンパイル使用メモリ | 79,000 KB |
実行使用メモリ | 52,336 KB |
最終ジャッジ日時 | 2024-07-23 10:33:33 |
合計ジャッジ時間 | 6,182 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
import java.io.*;import java.util.*;import java.util.function.*;import java.util.stream.*;public class Main {static final int MOD = 1000000007;public static void main(String[] args) throws Exception {Scanner sc = new Scanner();char[] inputs = sc.next().toCharArray();int length = inputs.length;int[] values = new int[]{0, 1, 2, 4, 5, 10, 20, 25, 50, 100};int size = values.length;Map<Integer, Integer> idxes = new HashMap<>();for (int i = 0; i < size; i++) {idxes.put(values[i], i);}int[][] matrix = new int[size][10];for (int i = 1; i < size; i++) {for (int j = 1; j < 10; j++) {matrix[i][j] = idxes.get(getGCD(values[i] * j, 100));}}int[][] dp = new int[length][size];for (int i = 1; i < inputs[0] - '0'; i++) {dp[0][matrix[1][i]]++;}int type = matrix[1][inputs[0] - '0'];for (int i = 1; i < length; i++) {int x = inputs[i] - '0';for (int j = 1; j < size; j++) {for (int k = 1; k < 10; k++) {dp[i][matrix[j][k]] += dp[i - 1][j];dp[i][matrix[j][k]] %= MOD;}}for (int j = 1; j < 10; j++) {dp[i][matrix[1][j]]++;}if (type >= 1) {for (int j = 1; j < x; j++) {dp[i][matrix[type][j]]++;}type = matrix[type][x];}}dp[length - 1][type]++;System.out.println(dp[length - 1][size - 1] % MOD);}static int getGCD(int x, int y) {if (y == 0) {return x;} else {return getGCD(y, x % y);}}}class Scanner {BufferedReader br;StringTokenizer st = new StringTokenizer("");StringBuilder sb = new StringBuilder();public Scanner() {try {br = new BufferedReader(new InputStreamReader(System.in));} catch (Exception e) {}}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}public String next() {try {while (!st.hasMoreTokens()) {st = new StringTokenizer(br.readLine());}} catch (Exception e) {e.printStackTrace();} finally {return st.nextToken();}}}