zoukankan      html  css  js  c++  java
  • 51nod 1068 Bash游戏 V3 博弈

    题目来源: Ural 1180
    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
     收藏
     关注
    有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。
    例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。(输入的N可能为大数)
     
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
    第2 - T + 1行:每行1个数N。(1 <= N <= 10^1000)
    Output
    共T行,如果A获胜输出A,如果B获胜输出B。
    Input示例
    3
    2
    3
    4
    Output示例
    A
    B
    A


    2的幂看上去很厉害的样子,然而这题还是属于bash博弈的变形,所以做法还是打表找规律
    然后发现只要是3的倍数就是B赢
    不过这题有个问题,就是会有大数,然后我就直接套了个大数模板 其实想起来只要每一位去除3看可不可以就行了 不过也懒得改了
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <iomanip>
    #include <math.h>
    #include <map>
    using namespace std;
    #define FIN     freopen("input.txt","r",stdin);
    #define FOUT    freopen("output.txt","w",stdout);
    #define INF     0x3f3f3f3f
    #define INFLL   0x3f3f3f3f3f3f3f
    #define lson    l,m,rt<<1
    #define rson    m+1,r,rt<<1|1
    typedef long long LL;
    typedef pair<int, int> PII;
    using namespace std;
    
    const int MX = 2500;
    const int MAXN = 9999;
    const int DLEN = 4;
    /*已重载>+-  % 和print*/
    class Big {
    public:
        int a[MX], len;
        Big(const int b = 0) {
            int c, d = b;
            len = 0;
            memset(a, 0, sizeof(a));
            while(d > MAXN) {
                c = d - (d / (MAXN + 1)) * (MAXN + 1);
                d = d / (MAXN + 1);
                a[len++] = c;
            }
            a[len++] = d;
        }
        Big(const char *s) {
            int t, k, index, L, i;
            memset(a, 0, sizeof(a));
            L = strlen(s);
            len = L / DLEN;
            if(L % DLEN) len++;
            index = 0;
            for(i = L - 1; i >= 0; i -= DLEN) {
                t = 0;
                k = i - DLEN + 1;
                if(k < 0) k = 0;
                for(int j = k; j <= i; j++) {
                    t = t * 10 + s[j] - '0';
                }
                a[index++] = t;
            }
        }
        Big operator/(const int &b)const {
            Big ret;
            int i, down = 0;
            for(int i = len - 1; i >= 0; i--) {
                ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
                down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
            }
            ret.len = len;
            while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
            return ret;
        }
        bool operator>(const Big &T)const {
            int ln;
            if(len > T.len) return true;
            else if(len == T.len) {
                ln = len - 1;
                while(a[ln] == T.a[ln] && ln >= 0) ln--;
                if(ln >= 0 && a[ln] > T.a[ln]) return true;
                else return false;
            } else return false;
        }
        Big operator+(const Big &T)const {
            Big t(*this);
            int i, big;
            big = T.len > len ? T.len : len;
            for(i = 0; i < big; i++) {
                t.a[i] += T.a[i];
                if(t.a[i] > MAXN) {
                    t.a[i + 1]++;
                    t.a[i] -= MAXN + 1;
                }
            }
            if(t.a[big] != 0) t.len = big + 1;
            else t.len = big;
            return t;
        }
        Big operator-(const Big &T)const {
            int i, j, big;
            bool flag;
            Big t1, t2;
            if(*this > T) {
                t1 = *this;
                t2 = T;
                flag = 0;
            } else {
                t1 = T;
                t2 = *this;
                flag = 1;
            }
            big = t1.len;
            for(i = 0; i < big; i++) {
                if(t1.a[i] < t2.a[i]) {
                    j = i + 1;
                    while(t1.a[j] == 0) j++;
                    t1.a[j--]--;
                    while(j > i) t1.a[j--] += MAXN;
                    t1.a[i] += MAXN + 1 - t2.a[i];
                } else t1.a[i] -= t2.a[i];
            }
            t1.len = big;
            while(t1.a[t1.len - 1] == 0 && t1.len > 1) {
                t1.len--;
                big--;
            }
            if(flag) t1.a[big - 1] = 0 - t1.a[big - 1];
            return t1;
        }
        int operator%(const int &b)const {
            int i, d = 0;
            for(int i = len - 1; i >= 0; i--) {
                d = ((d * (MAXN + 1)) % b + a[i]) % b;
            }
            return d;
        }
        Big operator*(const Big &T) const {
            Big ret;
            int i, j, up, temp, temp1;
            for(i = 0; i < len; i++) {
                up = 0;
                for(j = 0; j < T.len; j++) {
                    temp = a[i] * T.a[j] + ret.a[i + j] + up;
                    if(temp > MAXN) {
                        temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                        up = temp / (MAXN + 1);
                        ret.a[i + j] = temp1;
                    } else {
                        up = 0;
                        ret.a[i + j] = temp;
                    }
                }
                if(up != 0) {
                    ret.a[i + j] = up;
                }
            }
            ret.len = i + j;
            while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
            return ret;
        }
        void print() {
            printf("%d", a[len - 1]);
            for(int i = len - 2; i >= 0; i--) printf("%04d", a[i]);
        }
    };
    
    int main() {
        //FIN
        int T;
        scanf("%d", &T);
        char s[1005];
        while(T--) {
            scanf("%s", s);
            Big B(s);
            //B.print();
            if(B % 3 != 0) printf("A
    ");
            else printf("B
    ");
        }
        return 0;
    }
    

      



  • 相关阅读:
    Linux Shell常用技巧(一)
    使用Native API 创建进程
    Windows操作系统下创建进程的过程
    Windows操作系统下创建进程的过程
    windows运行打开服务命令
    windows运行打开服务命令
    出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法
    出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法
    对XP上的KiFastSystemCall进行浅析
    对XP上的KiFastSystemCall进行浅析
  • 原文地址:https://www.cnblogs.com/Hyouka/p/7368024.html
Copyright © 2011-2022 走看看