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

来源:互联网 发布:全国书法艺术网络大赛 编辑:程序博客网 时间:2024/05/17 18:03

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

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

代码:

#include <bits/stdc++.h>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;}