結果
問題 | No.2699 Simple Math (Returned) |
ユーザー | tobbie |
提出日時 | 2024-05-02 18:59:47 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 528 ms / 2,000 ms |
コード長 | 1,564 bytes |
コンパイル時間 | 1,875 ms |
コンパイル使用メモリ | 166,416 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-05-02 18:59:58 |
合計ジャッジ時間 | 10,575 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 418 ms
5,376 KB |
testcase_02 | AC | 488 ms
5,376 KB |
testcase_03 | AC | 381 ms
5,376 KB |
testcase_04 | AC | 515 ms
5,376 KB |
testcase_05 | AC | 472 ms
5,376 KB |
testcase_06 | AC | 475 ms
5,376 KB |
testcase_07 | AC | 497 ms
5,376 KB |
testcase_08 | AC | 520 ms
5,376 KB |
testcase_09 | AC | 500 ms
5,376 KB |
testcase_10 | AC | 519 ms
5,376 KB |
testcase_11 | AC | 528 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i, n) for (int i = 0; i < (int)n; i++) using ll = long long int; #define MOD 998244353 int mod_pow(int x, int n) { int ret = 1; while (n > 0) { if ((n & 0x01) != 0) ret = (long long)ret * x % MOD; x = (long long)x * x % MOD; n >>= 1; } return ret; } int main() { int T; cin >> T; rep(i, T) { int N, M; cin >> N >> M; // num = 10^N - 1 // den = 10^M + 1 // num = 10^(N-M)10^M - 1 = 10^(N-M)(10^M + 1) - 10^(N-M) - 1 // num/den = 10^(N-M) - (10^(N-M) + 1) / den // = 10^(N-M) - (10^(N-M*2)10^M + 1) / den // = 10^(N-M) - (10^(N-M*2)(10^M + 1) - 10^(N-M*2) + 1) / den // = 10^(N-M) - 10^(N-M*2) + (10^(N-M*2) - 1) / den // num%den = (10^(N-M*2) - 1) / den // N2 = N-M*2*k (N>=M*2*k) // num%den = (10^N2 - 1)/den = (10^(N2-M)10^M - 1) % den // = (10^(N2-M)(10^M + 1) - 10^(N2-M) - 1) % den // = (-10^(N2-M) - 1) % den // = ((10^M + 1) - 10^(N2-M) - 1) % (10^M + 1) // = (10^M - 10^(N2-M)) % (10^M + 1) // N2 < M ... 10^N2 - 1 < 10^M + 1 // num%den = 10^N2 -1 // N2 >= M ... N2 <= M*2 ... N2 - M < M // 10^M - 10^(N2-M) < 10^M + 1 // um%den = 10^M - 10^(N2-M) int N2 = N % (2*M); int ans; if (N2 < M) { ans = mod_pow(10, N2) - 1; } else { ans = mod_pow(10, M) - mod_pow(10, N2-M); } if (ans < 0) ans += MOD; cout << ans << endl; } return 0; }