SHU-“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校金馬五校賽-I-丟史蒂芬妮
阿新 • • 發佈:2019-02-16
描述
題解
與其說是博弈論問題,不如說是偽裝成博弈論的記憶化搜尋問題,通過記憶化搜尋來預處理出來所有狀態,然後直接訪問即可。
程式碼
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 555;
int n, m;
int prime[MAXN];
bool dp[MAXN][MAXN];
int vis[MAXN][MAXN];
bool dfs(int x, int y)
{
if (vis[x][y])
{
return dp[x][y];
}
vis[x][y] = true;
for (int i = 1; i <= prime[0]; i++)
{
if (x - prime[i] > 0)
{
dp[x][y] |= (!dfs(x - prime[i], y));
}
if (y - prime[i] > 0)
{
dp[x][y] |= (!dfs(x, y - prime[i]));
}
if (x - prime[i] > 0 && y - prime[i] > 0)
{
dp[x][y] |= (!dfs(x - prime[i], y - prime[i]));
}
}
return dp[x][y];
}
void init()
{
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= MAXN; i++)
{
if (!prime[i])
{
prime[++prime[0 ]] = i;
}
for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++)
{
prime[prime[j] * i] = 1;
if (i % prime[j] == 0)
{
break;
}
}
}
for (int i = 1; i < MAXN; i++)
{
for (int j = 1; j < MAXN; j++)
{
dfs(i, j);
}
}
}
int main()
{
init();
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
puts(dp[n][m] ? "Sora" : "Shiro");
}
return 0;
}