結果

問題 No.181 A↑↑N mod M
ユーザー 古寺いろは
提出日時 2015-04-06 00:32:27
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
WA  
実行時間 -
コード長 889 bytes
コンパイル時間 1,477 ms
コンパイル使用メモリ 168,472 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-07-04 02:25:47
合計ジャッジ時間 2,536 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 6
other AC * 21 WA * 16
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"
using namespace std;

int dfs(int A, int N, int M){
	if (M <= 1) return 0;
	if (N == 0) return 1;
	if (N == 1)
	{
		return A;
	}
	vector<int> v;
	if (A % M == 0) return 0;
	long long temp = 1;
	map<int, int> m;
	bool ok = false;
	do{
		m[temp] = v.size() + 1;
		v.push_back((int)temp);
		temp *= A;
		if (temp >= M * 3001){
			temp %= M;
			temp += M * 3000;
			ok = true;
		}
		if (ok && temp < M * 3000){
			temp %= M;
			temp += M * 3000;
		}
		//temp %= M;
		if (temp == 0) return 0;
	} while (m[temp] == 0);
	int loop = v.size() - (m[temp] - 1);
	int nextminus = (int)v.size() - loop;
	//cout << nextminus << " " << loop << endl;

	int r = dfs(A, N - 1, loop);
	if (r >= nextminus){
		r %= loop;
		if (r < nextminus) r += loop;
	}
	//cout << r << endl;

	return v[r];
}

int main() {
	int A, N, M;
	cin >> A >> N >> M;
	
	cout << dfs(A, N, M) % M << endl;
}

0