hdu 2177 威佐夫游戏

本文介绍了一种使用威佐夫游戏公式来判断当前局势是否为奇异局势的方法,通过暴力判断找到结果并直接break掉。该方法利用数学公式和循环实现,适用于特定场景下的游戏状态分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用威佐夫游戏的公式来判断当前局势是否为奇异局势,

ak = [k*(sqrt(5)+1)/2] , bk = ak+k;

然后暴力判断,因为每个自然数只在一种奇异局势中出现,所以找到结果后直接break掉就可以了.

#include <cstdio>
#include <cmath>
#define temp ((sqrt(5)+1)/2)

bool check ( int a , int b )
{
    if ( a > b )
    {
        a = a^b;
        b = a^b;
        a = a^b;
    }
    if ( a == (int)(temp*(b-a))) return true;
    return false; 
} 

int main ( )
{
    int a,b;
    while ( ~scanf ( "%d%d" , &a , &b ) , a+b )
    {
        if ( check ( a , b ) )
        {
            puts ( "0" );
            continue;
        }
        puts ( "1" );
        for ( int i = 1 ; i <= a ; i++ )
        {
            if ( check ( a-i , b-i ) )
                printf ( "%d %d\n" , a-i , b-i );    
        }   
        for ( int i = 1 ; i <= a ; i++ )
            if ( check ( a-i , b ) )
            {
                printf ( "%d %d\n" , a-i , b );
                break;
            }
        if ( a == b ) continue;
        for ( int i = 1 ; i <= b ; i++ )
            if ( check ( a , b-i ) )
            {
                int tb = b-i;
                if ( a > tb )
                {
                    a = a^tb;
                    tb = a^tb;
                    a = a^tb;
                }
                printf ( "%d %d\n" , a , tb );
                break;
            }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值