1. 程式人生 > 其它 >HDU-1517 A Multiplication Game

HDU-1517 A Multiplication Game

A Multiplication Game

巴什博奕

這題的控制範圍在於 x * 18

可以觀察:

  • 必敗態 \([n, +\infty]\)

  • 必勝態 [n / 9, n)

  • 必敗態 [n / 9 / 2, n / 9)

  • 必勝態 [n / 9 / 2 / 9, n / 9 / 2)

可發現必敗態是 [n / (k * 18), 2 * n / (k * 18))

因此我們只要考慮將 n 一直除到 18 以下,就可以判斷第一步,先手能否將狀態轉換為必敗態,也就是判斷此時的 n 與 9 的關係

#include <iostream>
using namespace std;

int main()
{
    double n;
    while (cin >> n) {
        while (n > 18) n /= 18;
        if (n <= 9) cout << "Stan wins." << endl;
        else cout << "Ollie wins." << endl;
    }
    return 0;
}

通過這道題,我還發現我總是會以一種很奇怪的方式水過一道題

例如直接搜尋sg函式

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
map<ll, int>sg;
ll n;

// 1 必輸  2 必勝
int dps(ll x)
{
    if(x >= n) return 1;
    if(sg[x]) return sg[x];
    int f = 1;
    for(int i=9; i>=2 && f == 1; i--)
        if(dps(x * i) == 1) f = 2;
    return sg[x] = f;
}

int main()
{
    while(cin >> n)
    {
        sg.clear();
        int ans = dps(1);
        if(ans == 1) cout << "Ollie wins." << endl;
        else cout << "Stan wins." << endl;
    }
    return 0;
}