添数博弈

26 阅读1分钟

根据添数博弈的规则,初始数池有两个整数x和y,两人轮流添数。每次操作选择数池中两个数计算差的绝对值,如果结果不在数池中则添加,否则游戏结束且当前玩家输。小A先手。游戏的关键在于初始两数的最大公约数(gcd)和较大值。所有能生成的数都是gcd的倍数,且不超过初始较大值。最终数池包含从gcd到较大值之间所有gcd的倍数。总操作次数(即新添数字的个数)为 max(x,y)/gcd(x,y)−2。若操作次数为奇数,先手小A获胜;否则后手小B获胜。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    let params = [];
    while ((line = await readline())) {
        let tokens = line.split(" ");
        // let a = parseInt(tokens[0]);
        // let b = parseInt(tokens[1]);
        // console.log(a + b);
        params.push(tokens);
    }
    // console.log(params)
    let t = parseInt(params[0][0]);
    function gcd(x, y) {
        while (y) {
            [x, y] = [y, x % y];
        }
        return x;
    }
    for (let i = 1; i <= t; i++) {
        let [x, y] = params[i].map((v) => parseInt(v));
        // console.log(x,y)
        let g = gcd(Math.max(x, y), Math.min(x, y));
        let time = Math.max(x, y) / g - 2;
        if (time % 2 != 0) {
            console.log("A");
        } else {
            console.log("B");
        }
        // 求x,y的最大公约数-2
    }
})();