結果

問題 No.613 Solitude by the window
ユーザー QCFiumQCFium
提出日時 2019-09-29 14:11:31
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 982 bytes
コンパイル時間 1,842 ms
コンパイル使用メモリ 179,012 KB
実行使用メモリ 235,520 KB
最終ジャッジ日時 2024-10-03 04:28:03
合計ジャッジ時間 8,574 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 6 TLE * 1 -- * 14
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

int ri() {
	int n;
	scanf("%d", &n);
	return n;
}
int64_t rll() {
	long long n;
	scanf("%lld", &n);
	return n;
}

int main() {
	int64_t n = rll();
	int m = ri();
	if (m == 2) {
		std::cout << 0 << std::endl;
		return 0;
	}
	int cur = 2;
	std::map<int, int> rep = {
		{1000000007, 250000001},
		{1000000024, 15625000},
		{1099999997, 61111110},
	};
	if (rep.count(m)) {
		n %= rep[m];
		for (int i = 0; i < n; i++) cur = (int64_t) cur * (cur + 4) % m;
	} else {
		std::vector<bool> used(m);
		std::vector<int> list;
		list.reserve(50000000);
		int i = 0;
		for (; i < n; i++) {
			if (used[cur]) break;
			used[cur] = true;
			list.push_back(cur);
			cur = (int64_t) cur * (cur + 4) % m;
		}
		if (i < n) {
			int index = -1;
			for (int i = 0; i < (int) list.size(); i++) if (list[i] == cur) { index = i; break; }
			assert(index != -1);
			int left = (n - i) % (i - index);
			cur = list[index + left];
		}
	}
	std::cout << cur << std::endl;
	return 0;
}
0