【AtCoder】ABC 460 E - x + y ≡ x + y

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 1362 / NoviSteps: 1D / 配点: 450 点
問題概要
正整数 に対して、 と を文字列と見なしてこの順に連結して書いた時に出来る整数を と呼ぶことにする。
正整数 が与えられるとき、 以下の正整数の組 であって であるものの個数を で割った余りを求めよ。
個のテストケースが与えられるので、それぞれについて答えを求めること。
制約
- 入力される値は全て整数
考察
とりあえず、問題条件を数式で表してみる。 の桁数を とすると、
となる。
式 より, 求める条件は と についてのみ依存することが分かる。
ここで、 であることから は最大で なので、以下では を固定したときの の条件について考えることにしよう。
を固定したときの の個数
式 を以下のように言い換える。 なお、 は が の倍数であることを表す。
今は に関する条件を考えているので、右側を だけで表したい。 そこで、 として を考えると、 と と表せる。 すると、式 は以下のように変形できる。
と は互いに素であるため、 の素因数は全て 側に含まれていなければならない。 したがって、
が成り立つ。
式 より、 とおくと、 は を満たす の倍数であるから、ある における条件を満たす の個数 は、 と計算できる。
桁数が となるような の個数
の桁数が であるための条件は、 である。
しかし、これに加えて も満たす必要があるため、 の桁数が であるような の個数 は、
と計算できる。
以上より、求める答えは以下のように計算できる。
実装上の注意点
今回の方針だと は最大 まで登場するので、 がlong long 型だとオーバーフローしてしまう。
そこで、 や を __int128_t 型で計算する必要がある。
また、 の式における の計算については、
が成り立つことを踏まえると、 ACL のpow_modを用いることによって long long 型のまま計算できる。
実装例
ACLのmod_intを使ってみたが、却ってごちゃごちゃしてしまった。
1.#include <bits/stdc++.h>2.using namespace std;3. 4.#if __has_include(<atcoder/all>)5.#include <atcoder/all>6.using namespace atcoder;7.#endif8. 9.#define repe(i, start, end) for (auto i = (start); (i) <= (end); (i)++)10. 11.using ll = long long;12.using mint = modint998244353;13. 14.// ======================================== //15. 16.using i128 = __int128_t;17.constexpr int MOD = 998244353;18. 19.ll solve() {20. ll N, M;21. cin >> N >> M;22. 23. vector<i128> pow10(20);24. pow10[0] = 1;25. repe(i, 1, 19) {26. pow10[i] = pow10[i - 1] * 10;27. }28. 29. mint ans = 0;30. 31. repe(d, 1, 19) {32. i128 right = min<i128>(N, pow10[d] - 1);33. i128 cnt_y = max<i128>(0, right - pow10[d - 1] + 1);34. 35. if (cnt_y == 0) continue;36. 37. ll r = (pow_mod(10, d, M) - 1 + M) % M;38. ll g = gcd(M, r);39. 40. ll Ld = M / g;41. ll cnt_x = N / Ld;42. 43. ans += mint((ll)(cnt_y % MOD)) * mint(cnt_x % MOD);44. }45. 46. return ans.val();47.}48. 49.int main()50.{51. int T;52. cin >> T;53. 54. while (T--)55. {56. cout << solve() << endl;57. }58. 59. return 0;60.}
実装時間: 50 分
コメント
式 から式 への変形の発想が難しい。





