フェッチ石ゲームHDU-1527 Wizovゲーム

 

石の山は2つあり、その数は任意であり、異なる場合があります。ゲームの開始時に、2人が交互に石を手に入れます。ゲームでは、毎回2つの異なる方法で石を取り出すことができると規定しています。1つは、任意の山から任意の数の石を取り出すことができること、もう1つは、両方の山から同じ数の石を同時に取り出すことができることです。結局、すべての石を仕上げたのが勝者でした。最初に2石の山の数を指定します。最初に取る順番である場合は、両方の当事者が最善の戦略をとっていると仮定し、最終的に勝者か敗者かを尋ねます。

入力入力には、いくつかの種類の石の初期状態を表す複数の行が含まれます。各行には、2つの石の山の数を表す2つの非負の整数aとbが含まれ、aもbも1,000,000,000を超えません。出力出力に対応する行もいくつかあります。各行には1または0の数字が含まれています。最終的に勝者の場合は1、それ以外の場合は0です。入力例

2 1 
8 4 
4 7

出力例

0 
1 
0 
ワイソフのゲーム:いくつかのアイテムの2つの山があり、2人が交代でどちらかの山から少なくとも1つを取得するか、2つの山から同時に多くのアイテムを取得します。光に勝った人だけが勝つでしょう。
この状況は非常に複雑です。(a [k]、b [k])(a [k]≤b [k]、k = 0、1、2、...、n)を使用して、アイテムの2つの山の数を表し、それをシチュエーションと呼びます。 Aが(0、0)を向いている場合、Aはすでに負けています。この状況は、特異な状況と呼ばれます。最初のいくつかの奇妙な状況は、(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、( 11、18)、(12、20)。(注:kは奇妙な状況の数を表し、最初の奇妙な状況k = 0)
a [0] = b [0] = 0、a [k]はこれまでにない最小の自然数、b [k] = a [k] + kであることがわかります。

奇妙な状況の性質

1。任意の自然数が1つだけの特異な状況に含まれます。
a [k]はこれまでにない最小の自然数であるため、[k]> a [k-1]とb [k] = a [k] + k> a [k-1] + kがあります。 > a [k-1] + k-1 = b [k-1]> a [k-1]。したがって、プロパティ1は保持されます。
2。どの操作でも、特異な状況を非特異な状況に変更できます。
実際、特異な状況の1つのコンポーネント(a [k]、b [k])のみが変更された場合、他のコンポーネントは他の特異な状況になることはできないため、非特異な状況である必要があります。(a [k]、b [k])の2つのコンポーネントが同時に削減された場合、その差は変わらず、他の特異な状況の差にはならないため、これも非特異な状況です。
3。適切な方法を使用すると、非特異な状況を特異な状況に変えることができます。
直面している状況が(a、b)であるとすると、b = aの場合、オブジェクトは2つの山から同時に取得され、特異な状況(0、0)になります。a= a [k]、b>の場合b [k]次に、b-b [k]オブジェクトを取得すると、奇妙な状況になります。a= a [k]、b <b [k]の場合、同時に2つの山からaa [ba]を取得します(注:ここでは、baはaの添え字であり、*(ba)ではありません)オブジェクトは特異な状況になります(a [ba]、b-a + a [ba]); a> a [k]、b = aの場合[k] + k次に、最初のパイルから余分なa-a [k]を削除します。a<a [k]、b = b [k]の場合、2つのケースがあります。最初のケース、a = a [n](n <k)は2番目のパイルからb-b [n]を取得します;第2種、a = b [n](n <k)は2番目のパイルからb-を取得します[n]で十分です。

結論:

両方が正しいアクションをとる場合、特異でない状況に直面した場合、勝者が最初に勝ち、そうでない場合、勝者は後で勝ちます。
では、どのような状況(a、b)でも、それが奇妙な状況であるかどうかをどのように判断するのでしょうか。次の式があります。
ak = [k(1 +√5)/ 2]、bk = ak + k(k = 0、1、2、... n角括弧は丸め関数を示します)
素晴らしいのは、黄金分割数(1 +√5)/ 2 = 1.618 ...であることです。したがって、akとbkで構成される長方形は、ほぼ黄金の長方形です。2/(1 +√5)=(√5- 1)/ 2、最初にj = [a(√5-1)/ 2]を見つけることができます。a= [j(1 +√5)/ 2]の場合、a = aj、bj = aj + j、等しくない場合、a = aj + 1、b = aj + j + 1、等しくない場合、奇妙な状況ではありません。次に、上記のルールに従って続行すると、奇妙な状況に確実に遭遇します。
#include <bits / stdc ++。h>
 using  namespace std; 
typedef long  long ll;
const ll inf = 4e18 + 10 ;
const  int mod = 1000000007 ;
const  int mx = 1e6; // 制限をチェックし、ダミーの 
typedefペア< intint > pa;
const  double PI = acos(-1 ); 
ll gcd(ll a、ll b){ return b?gcd(b、a%b):a; }
 #define swa(a、b)a ^ = b ^ = a ^ = b
 #definere(i、a、b)for(int i =(a)、_ =(b); i <_; i ++)
 #define rb(i、a、b)for(int i =(b)、_ = (a); i> = _; i--)
 #define clr(a)memset(a、0、sizeof(a))
 #define lowbit(x)((x)&(x-1))
 #define mkp make_pair
 void sc(int&x){scanf(" %d "、&​​x); } void sc(int64_t&x){scanf(" %lld "、&​​x); } void sc(double&x){scanf(" %lf "、&​​x); } void sc(char&x){scanf(" %c "&バツ); } voidsc(char * x){scanf(" %s " 、x); }
 int main()
{ 
    ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0 );
    int n、m;
    ダブルゴールド=(1 + sqrt(5))/ 2 ; // 黄金分割
    while(cin >> n >> m)
    { 
        int a = min(n、m)、b = max(n、m);
        double k =(double)(b- a);
        int test =(int)(k * ゴールド);
        if(test == a)cout << 0 << endl;
        それ以外の場合、 cout << 1 << endl; 
    } 
    0を返し ます
}

 

おすすめ

転載: www.cnblogs.com/xxxsans/p/12729417.html