結果
| 問題 |
No.181 A↑↑N mod M
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-07-20 23:06:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 812 bytes |
| コンパイル時間 | 1,421 ms |
| コンパイル使用メモリ | 171,352 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-02 14:09:55 |
| 合計ジャッジ時間 | 2,417 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 32 WA * 5 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int A, N, M;
cin >> A >> N >> M;
function<int(int, int, int)> rec = [&](int V, int N, int MOD){
if(N == 0)return 1;
if(MOD == 1)return 1000000;
vector<int> order, used, tb(MOD, -1);
int c = 0, tim = 0;
long long val = 1;
while(tb[val] == -1){
tb[val] = tim++;
order.push_back(val);
used.push_back(c);
val *= V;
if(val >= MOD)c = 1;
val %= MOD;
}
int EXP = rec(V, N - 1, (tim - tb[val]));
if(EXP < tb[val])return order[EXP] + used[EXP] * MOD;
int idx = (EXP - tb[val]) % (tim - tb[val]) + tb[val];
return order[idx] + used[idx] * MOD;
};
cout << rec(A, N, M) % M << endl;
}