zoukankan      html  css  js  c++  java
  • 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2 

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

     收藏

     关注

    有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。

    例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。

    Input

    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
    第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 10^18)

    Output

    共T行,如果A获胜输出A,如果B获胜输出B。

    Input示例

    3
    3 5
    3 4
    1 9

    Output示例

    B
    A
    A

    解题思路: 
    如果 这个题目中数据范围不是很大的话 直接乘以 (sqrt(5)+1)/2 就行了,但是这个题目中,数据范围太大,直接乘的话会有精度问题,所以我们就减少精度问题,就将 0.618033988749894848204586834...0.618033988749894848204586834... 拆成整数放进数组里,然后通过乘法来减少精度的损失。

    #include<iostream>
    #include<cmath>
    #define ll long long
    using namespace std;
    ll inf=1000000000;
    ll a[3]={618033988,749894848,204586834};//模拟百、十、个位
    int main()
    {
        ll x,y,t;
        scanf("%lld",&t);
        while(t--)
        {
            scanf("%lld%lld",&x,&y);
            if(x<y) swap(x,y);
            ll dis=x-y;
            ll t0=dis/inf;//模拟十位
            ll t1=dis%inf;//模拟个位
            ll sum=t1*a[2];//个位
            sum=t0*a[2]+t1*a[1]+sum/inf;//十位
            sum=t0*a[1]+t1*a[0]+sum/inf;//百位
            sum=dis+t0*a[0]+sum/inf;//dis+后面小数进位产生的结果
            if(sum==y)
                printf("B
    ");
            else
                printf("A
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    无题
    【HNOI 2002 】营业额统计
    P1589
    【网络流24题】最长递增子序列
    【NOI2008】志愿者招募
    【NOI2015】软件包管理器
    P1347
    【BZOJ 3262三维偏序】陌上花开
    数论六·模线性方程组
    数论五·欧拉函数
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/9502684.html
Copyright © 2011-2022 走看看