結果
問題 | No.2032 Let's Write Multiples!! |
ユーザー | そすうぽよ |
提出日時 | 2022-08-05 22:56:24 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,250 bytes |
コンパイル時間 | 2,409 ms |
コンパイル使用メモリ | 211,856 KB |
実行使用メモリ | 10,624 KB |
最終ジャッジ日時 | 2024-09-15 20:21:41 |
合計ジャッジ時間 | 7,192 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 15 ms
10,624 KB |
testcase_01 | TLE | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
ソースコード
#include <bits/stdc++.h> #include <variant> #define rep2(i, k, n) for (i64 i = (i64)(k); i < (i64)(n); i++) #define rep(i, n) rep2(i, 0, n) #define all(x) begin(x), end(x) #ifdef ENV_LOCAL #define dump \ if (1) cerr #else #define dump \ if (0) cerr #endif using namespace std; using namespace std::string_literals; using i32 = int32_t; using i64 = int64_t; using f64 = double; using f80 = long double; using vi32 = vector<i32>; using vi64 = vector<i64>; // using namespace harudake; i64 f(i64 i, i64 c) { i64 ans = 0; while (i > 0) { if (i % 10 == c) ++ans; i /= 10; } return ans; } constexpr i64 mul = 10000; i64 solve_large(i64 r, i64 k, i64 c) { i64 ans = 0; for (i64 i = 0; i + mul < r; i += mul) { i64 v = f(i, c); i64 num = (i + mul - 1) / k - (i - 1) / k; ans += v * num; } i64 last = r / mul * mul; i64 lstart = (last + k - 1) / k * k; for (i64 i = lstart; i <= r; i += k) { ans += f(i / mul, c); } return ans; } i64 solve_small(i64 r, i64 k, i64 c) { i64 ans = 0; unordered_map<i64, i64> m; vi64 seq; m[0] = 0; seq.push_back(0); i64 num = k % mul; i64 coeff = 1; while (num <= r) { if (m.count(num) > 0) { break; } m[num] = coeff; seq.push_back(f(num, c)); num += k; num %= mul; ++coeff; } i64 cycle = coeff - m[num]; i64 beg = m[num]; i64 d = r / k; if (d <= beg) { rep(i, d + 1) { ans += seq[i]; } } else { i64 c = (d - beg) / cycle; i64 r = (d - beg) % cycle; rep(i, beg) { ans += seq[i]; } rep2(i, beg, coeff) { ans += c * seq[i]; } rep2(i, beg, beg + r + 1) { ans += seq[i]; } } return ans; } i64 solve_naive_large(i64 r, i64 k, i64 c) { i64 ans = 0; for (i64 i = k; i <= r; i += k) { ans += f(i / mul, c); } return ans; } i64 solve(i64 r, i64 k, i64 c) { i64 s = solve_small(r, k, c); i64 l = solve_large(r, k, c); // i64 nl = solve_naive_large(r, k, c); // dump << s << " " << l << " " << nl << endl; return s + l; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); i64 t; cin >> t; rep(ccnt, t) { i64 l, r, k, c; cin >> l >> r >> k >> c; i64 ans = solve(r, k, c) - solve(l - 1, k, c); cout << ans << "\n"; } return 0; }