結果
| 問題 |
No.7 プライムナンバーゲーム
|
| コンテスト | |
| ユーザー |
prog470
|
| 提出日時 | 2016-09-14 12:08:24 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,850 bytes |
| コンパイル時間 | 476 ms |
| コンパイル使用メモリ | 68,824 KB |
| 最終ジャッジ日時 | 2024-11-14 19:49:44 |
| 合計ジャッジ時間 | 878 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp: In function ‘void primMake()’:
main.cpp:27:21: error: ‘sqrt’ was not declared in this scope
27 | if (sqrt(10000.0) <= (double)pr) {
| ^~~~
ソースコード
#include<stdio.h>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int dp[10005];
//自分のターンでiだったときの勝敗はdp[i]
set<int> prim;
int num[10001] = {}, pr; //num[i]==0ならiは素数リストにある
void primMake() {
pr = 2;
num[0] = num[1] = 1;
while (1) {
prim.insert(pr);
if (sqrt(10000.0) <= (double)pr) {
break;
}
for (int i = pr; i <= 10000; i++) {
if (i % pr == 0) {
num[i] = 1;
}
}
for (int i = pr; i <= 10000; i++) {
if (num[i] != 1) {
pr = i;
break;
//このbreakないとprは永久に同じ
}
}
}
for (int i = 2; i <= 10000; i++) {
if (num[i] == 0) prim.insert(i);
}
}
int f(int n) {
if (dp[n] != -1) return dp[n];
//次のdpに、少なくとも一つはかつ道(次のdp = 0)があるならdp[n]=1
bool flag = false;
set<int>::iterator dip = prim.begin();
while ((*dip) <= n && dip != prim.end()) {
//cout << "n: " << n << " diff: " << (*dip) << " toNum: " << (n - (*dip)) << endl;
//now以下の素数に順にアクセス(小さいほうから)
if (f(n - (*dip)) == 0) flag = true;
//次が0とは、つまり相手が負けること
dip++;
}
if (flag) {
//cout << "dp[" << n << "]: " << 1 << endl;
return dp[n] = 1;
}
else {
//cout << "dp[" << n << "]: " << 0 << endl;
return dp[n] = 0;
}
}
int main() {
fill(dp, dp+10005, -1);
dp[0] = dp[1] = 1;
// 1:win, 0:lose, -1:NULL
//自分のターンで0or1なら既に相手が、それしか選べなかったということ
int N;
cin >> N;
primMake();
//cout << "prim list sinish!" << endl;
f(N);
if (dp[N] == 1) cout << "Win"<< endl;
else cout << "Lose" << endl;
return 0;
}
prog470