結果
| 問題 |
No.7 プライムナンバーゲーム
|
| コンテスト | |
| ユーザー |
vrjfsyi
|
| 提出日時 | 2018-03-25 09:23:39 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 973 ms / 5,000 ms |
| コード長 | 1,294 bytes |
| コンパイル時間 | 648 ms |
| コンパイル使用メモリ | 76,804 KB |
| 実行使用メモリ | 28,416 KB |
| 最終ジャッジ日時 | 2024-10-01 16:10:07 |
| 合計ジャッジ時間 | 7,268 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 17 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <array>
#include <map>
#include <stack>
#include <queue>
#include <set>
using namespace std;
vector<int> sieveOfEratosthenes(int n) {
vector<int> primes(n);
for (int i = 2; i < n; ++i) {
primes[i] = i;
}
for (int j = 2; j * j < n; ++j) {
if (primes[j]) {
for (int i = j * j; i < n; i += j) {
primes[i] = 0;
}
}
}
return primes;
}
int grundy(int dp[], int x, vector<int> primes) {
if (dp[x] != -1 or
x == 2 or
x == 3)
return dp[x];
set<int> s;
for (auto p : primes) {
if (x - p >= 2) {
s.insert(grundy(dp, x - p, primes));
}
}
int result = 0;
while (s.count(result)) {
result++;
}
dp[x] = result;
return result;
}
int main() {
int N;
cin >> N;
vector<int> v = sieveOfEratosthenes(N);
v.erase(remove(v.begin(), v.end(), 0), v.end());
int dp[10001];
for (int i = 0; i <= N; ++i) {
dp[i] = -1;
}
dp[2] = dp[3] = 0;
int result = grundy(dp, N, v);
if (result == 0) {
cout << "Lose" << "\n";
} else {
cout << "Win" << "\n";
}
return 0;
}
vrjfsyi