外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

解説

D - Big mod Small

作成者 kammyu、yesantikiss、yuki4869

テスター yesantikiss、yuki4869

配点 100 点

実行時間制限
2 秒
メモリ制限
512 MiB

NN の上から ii 桁目を NiN_i とし、NN から上 ii 桁を取り出した数を UiU_i とします。
ここで、NN の KK 進数での桁数を ∣N∣|N| としたとき、 U∣N∣=NU_{|N|}=N です。

求めたい値は、N mod M=U∣N∣ mod MN\bmod M=U_{|N|}\bmod M です。

Ui+1=KUi+Ni+1Ui+1 mod M=(KUi+Ni+1) mod MUi+1 mod M=(K(Ui mod M)+Ni+1) mod M\begin{aligned} U_{i+1}&=KU_i+N_{i+1}\\ U_{i+1}\bmod M&=(KU_i+N_{i+1})\bmod M\\ U_{i+1}\bmod M&=(K(U_i\bmod M)+N_{i+1})\bmod M \end{aligned}

であることから、Ui mod MU_i\bmod M のみを保持すればいいことが分かります。
上の漸化式を適切に実装することで O(∣N∣)=O(log⁡N)O(|N|)=O(\log N) で解くことができました。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int K, M;
  string S;
  cin >> K >> M >> S;
  long long ans = 0;
  for (char c : S)
    ans = (ans * K + (c - '0')) % M;
  cout << ans << endl;
}

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。