51nod 1185 威佐夫游戏 V2 (博弈+大数乘法模拟)

题目链接:
点击打开题目链接

题解:
如果数据在 106 左右,可以直接用 (ba)5+12 。但是这道题数据是 1018 ,那么直接乘的话,肯定会有精度问题。那么我么可以上Java大数的。但是我不会Java啊… 我们也可以直接大数乘法手动模拟。为了提高精度,我们将 0.618033988749894848204586834... 拆成三部分的整数放进数组里,然后手动模拟乘法。

代码:

#include 
using namespace std;
typedef long long ll;
 //0.618033988749894848204586834... 拆成整数放进数组里,
 //拆成三部分即可 
ll tmp[3] = {618033988,749894848,204586834};
ll MOD = 1e9;

int main()
{
    int t;  
    scanf("%d",&t);
    while(t --)
    {
        ll a,b;
        scanf("%lld%lld",&a,&b);        
        if(a > b)
        {
            ll t = a;
            a = b;
            b = t;
        }
        ll diff = b - a;
        //把10^18分成两部分10^9
        ll ta = diff / MOD; 
        ll tb = diff % MOD;

        ll tp = tb * tmp[2];
        tp = ta * tmp[2] + tb * tmp[1] + tp / MOD;
        tp = ta * tmp[1] + tb * tmp[0] + tp / MOD;
        tp = ta * tmp[0] + tp / MOD + diff; 

        if(tp == a)
            printf("B\n");
        else
            printf("A\n");
    }
    return 0;
}

你可能感兴趣的:(ACM_博弈论,51NOD)