1. 程式人生 > 實用技巧 >HDU 6869-Slime and Stones【威佐夫博弈拓展】

HDU 6869-Slime and Stones【威佐夫博弈拓展】

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6869

分析

顯然,當 \(k=1\) 時,直接就是威佐夫博弈。

威佐夫博弈的必敗態 \((a,b)\) 的通項公式:

\[a_i=[i·f],b_i=a_i+i\ (i=0,1,2,...) ,f=\frac{\sqrt{5}+1}{2},[x]表示取整 \]

考慮 \(k=1\) 的情況,推導前面幾項 \((a,b),a\leq b\)

\[(0,0),(1,3),(2,6),(4,10),(5,13),(7,17),(8,20)... \]

由此,可以發現:\(b_i=a_i+2·i\ (i=0,1,2,3...)\)

採用和威佐夫博弈公式相同的推導方法,即 貝蒂定理(Betty Theorem):

介紹:https://zhuanlan.zhihu.com/p/149621032

威佐夫博弈的公式來自於:

\[\frac{1}{x}+\frac{1}{x+1}=1 \]

解得:\(x=\frac{\sqrt{5}+1}{2}\)

列出方程:

\[\frac{1}{x}+\frac{1}{x+k+1}=1 \]

根據二元一次方程的通解:\(x=\frac{-b\pm \sqrt{b^2-4ac}}{2a}=\frac{(1-k)\pm \sqrt{k^2+2k+5}}{2}\)

取正解:\(x=\frac{1-k+\sqrt{k^2+2k+5}}{2}\)

所以,

\[\begin{cases} a_i &= [\frac{1-k+\sqrt{k^2+2k+5}}{2}·i]\\ b_i &= a_i+(k+1)*i=[\frac{3-k+\sqrt{k^2+2k+5}}{2}·i] \end{cases} \]

驗證時,先求出 \(i=\lfloor (b-a)/(k+1)\rfloor\),然後代入 \(i\) 的值,驗證以上的兩個通項公式。

程式碼

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int T,a,b,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&a,&b,&k);
        if(a>b) swap(a,b);
        double k1=(1-1.0*k+sqrt(1.0*k*k+2.0*k+5.0))/2.0;
        double k2=(3+1.0*k+sqrt(1.0*k*k+2.0*k+5.0))/2.0;
        int d=(b-a)/(k+1);
        if(floor(d*k1)==a&&floor(d*k2)==b) printf("0\n");
        else printf("1\n");
    }
    return 0;
}

參考部落格:
https://blog.csdn.net/oampamp1/article/details/108083039
https://blog.csdn.net/qq_43814654/article/details/108086427