結果

問題 No.308 素数は通れません
ユーザー minami
提出日時 2019-03-30 18:02:42
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,969 bytes
コンパイル時間 1,811 ms
コンパイル使用メモリ 178,892 KB
実行使用メモリ 6,824 KB
最終ジャッジ日時 2024-11-15 20:57:14
合計ジャッジ時間 4,811 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 99 WA * 8
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"
using namespace std;
#ifdef _DEBUG
#include "dump.hpp"
#else
#define dump(...)
#endif

//#define int long long
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define all(c) begin(c),end(c)
const int INF = sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = 1'000'000'007;
template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

// エラトステネスの篩
vector<char> eratos(int n) {
	vector<char> is_prime(n + 1, true);
	is_prime[0] = is_prime[1] = false;
	for (int i = 2; i*i <= n; i++)
		if (is_prime[i]) {
			int j = i + i;
			while (j <= n) {
				is_prime[j] = false;
				j += i;
			}
		}
	return is_prime;
}

signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	int N; cin >> N;
	if (N < 50) {
		auto e = eratos(N);
		static const int di[] = { 1,0,-1,0 };
		static const int dj[] = { 0,1,0,-1 };
		using State = tuple<int, int, int>;
		rep(w, 1, N + 1) {
			dump(w);
			vector<bool> f(N + 1);
			int H = (N - 1) / w + 1, W = w;
			auto inrange = [&](int i, int j) { return i >= 0 && i < H && j >= 0 && j < W; };
			auto bfs = [&](int si, int sj, int gi, int gj) {
				queue<State> q;
				q.emplace(0, si, sj);
				while (q.size()) {
					int d, ci, cj; tie(d, ci, cj) = q.front(); q.pop();
					if (ci == gi && cj == gj)return d;
					rep(i, 0, 4) {
						int ni = ci + di[i], nj = cj + dj[i];
						int nx = ni * w + nj + 1;
						if (!inrange(ni, nj))continue;
						if (nx > N)continue;
						if (e[nx])continue;
						if (f[nx])continue;
						f[nx] = true;
						q.emplace(d + 1, ni, nj);
					}
				}
				return -1;
			};
			auto res = bfs(0, 0, (N - 1) / w, (N - 1) % w);
			dump(res);
			if (res != -1) {
				cout << w << endl;
				break;
			}
		}
	}
	else {
		cout << 8 << endl;
	}
	return 0;
}
0