結果
問題 | No.2032 Let's Write Multiples!! |
ユーザー | ygussany |
提出日時 | 2022-07-24 19:17:02 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 2,168 ms / 3,000 ms |
コード長 | 2,470 bytes |
コンパイル時間 | 331 ms |
コンパイル使用メモリ | 32,588 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-21 08:34:13 |
合計ジャッジ時間 | 28,551 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1,267 ms
5,376 KB |
testcase_02 | AC | 38 ms
5,376 KB |
testcase_03 | AC | 22 ms
5,376 KB |
testcase_04 | AC | 1,491 ms
5,376 KB |
testcase_05 | AC | 1,501 ms
5,376 KB |
testcase_06 | AC | 1,464 ms
5,376 KB |
testcase_07 | AC | 1,102 ms
5,376 KB |
testcase_08 | AC | 1,101 ms
5,376 KB |
testcase_09 | AC | 2,168 ms
5,376 KB |
testcase_10 | AC | 1,099 ms
5,376 KB |
testcase_11 | AC | 1,090 ms
5,376 KB |
testcase_12 | AC | 1,118 ms
5,376 KB |
testcase_13 | AC | 1,087 ms
5,376 KB |
testcase_14 | AC | 1,051 ms
5,376 KB |
testcase_15 | AC | 1,497 ms
5,376 KB |
testcase_16 | AC | 1,477 ms
5,376 KB |
testcase_17 | AC | 1,487 ms
5,376 KB |
testcase_18 | AC | 1,488 ms
5,376 KB |
testcase_19 | AC | 1,440 ms
5,376 KB |
testcase_20 | AC | 650 ms
5,376 KB |
testcase_21 | AC | 794 ms
5,376 KB |
testcase_22 | AC | 799 ms
5,376 KB |
testcase_23 | AC | 824 ms
5,376 KB |
testcase_24 | AC | 792 ms
5,376 KB |
ソースコード
#include <stdio.h> const int dig[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; long long div_mod(long long x, long long y, long long z) { if (x % y == 0) return x / y; else return (div_mod((1 + x / y) * y - x, (z % y), y) * z + x) / y; } int gcd(int a, int b) { if (a == 0) return b; else return gcd(b % a, a); } int solve(int R, int K, int C) { static int r[10], lower[10], upper[10], dig_mod[10]; int d, i, j, k, l, m, g, dd, KK, RR, ans = 0, inv; for (d = 0, RR = R; RR > 0; d++, RR /= 10) { r[d] = RR % 10; dig_mod[d] = dig[d] % K; } for (i = 1, lower[0] = 0; i < d; i++) lower[i] = lower[i-1] + r[i-1] * dig[i-1]; for (i = d - 2, upper[d-1] = 0; i >= 0; i--) upper[i] = upper[i+1] * 10 + r[i+1]; for (i = d - 1; i >= 0; i--) { if (upper[i] < 10000) { l = dig[i] % K; m = dig[i] / K; for (j = 0, k = (K - C * dig[i] % K) % K; j < upper[i]; j++, k -= dig_mod[i+1]) { if (k < 0) k += K; if (k < l) ans += m + 1; else ans += m; } if (r[i] >= C) { if (k < 0) k += K; if (r[i] == C) { l = (lower[i] + 1) % K; m = (lower[i] + 1) / K; } if (k < l) ans += m + 1; else ans += m; } } else { g = gcd(K, dig_mod[i+1]); KK = K / g; dd = dig_mod[i+1] / g; for (j = 0, k = (K - C * dig[i] % K) % K; j < dig[i]; j++, k--) { if (k < 0) k += K; if (k % g == 0) break; } if (k % g != 0) continue; if (dd == 0) { k /= g; for (; j <= lower[i]; j += g, k--) { if (k < 0) k += KK; if (k == 0) ans += upper[i] + ((r[i] >= C)? 1: 0); } for (; j < dig[i]; j += g, k--) { if (k < 0) k += KK; if (k == 0) ans += upper[i] + ((r[i] > C)? 1: 0); } continue; } inv = div_mod(1, dd, KK); k = (long long)k / g * inv % KK; if (r[i] < C) { l = upper[i] % KK; m = upper[i] / KK; } else { l = (upper[i] + 1) % KK; m = (upper[i] + 1) / KK; } for (; j <= lower[i]; j += g, k -= inv) { if (k < 0) k += KK; if (k < l) ans += m + 1; else ans += m; } if (r[i] <= C) { l = upper[i] % KK; m = upper[i] / KK; } for (; j < dig[i]; j += g, k -= inv) { if (k < 0) k += KK; if (k < l) ans += m + 1; else ans += m; } } } return ans; } int main() { int T, L, R, K, C; scanf("%d", &T); while (T--) { scanf("%d %d %d %d", &L, &R, &K, &C); printf("%d\n", solve(R, K, C) - solve(L - 1, K, C)); } fflush(stdout); return 0; }