class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param piles int整型vector 
     * @return int整型vector
     */
    vector<int> canWin(vector<int>& piles) {
        // write code here
        // 这种谁先手然后一堆规则的游戏一般都是有规律的,拿到题目可以自己随便出一点数字模拟一下
        // 这道题就是每个人每一轮有三种取法选其一,取 1 块,取 2 块,取 3 块
        // 谁把最后一块石头取掉谁就赢了。
        // 问题可以从最简单的情况出发,石头总数是 1,2,3 的时候先手的牛牛稳赢,没什么好说的,
        // 后续的情况全部都可以从前面得到的结果推出。
        // 石头总数是 4 的时候,牛牛先手不管是取多少块,剩下的块数都小于等于 3,后手的人可以一次性取走,
        // 石头总数是 4 这里必输。
        // 石头总数是 5 的时候,牛牛先手取 1 块,问题转化为对手先手且石头总数为 4 的子问题,对手必输。
        // 石头总数是 6 的时候,牛牛先手取 2 块,问题转化为对手先手且石头总数为 4 的子问题,对手必输。
        // 石头总数是 7 的时候,牛牛先手取 3 块,问题转化为对手先手且石头总数为 4 的子问题,对手必输。
        // 石头总数是 8 的时候,牛牛先手不管取多少块,对手都可以将问题转化为自己的对手先手且
        // 石头总数为 4 的子问题,这样牛牛就必输。
        // ......
        // “能否保证自己赢得游戏”的意思其实是牛牛先手取完石头构造一个对手必输的情况就可以了,
        // 而不是说牛牛先手怎么玩都能赢。自己模拟之后会发现只要能构造出
        // “对手先手且石头总数为 4 倍数的子问题” 这样对手就必输,可以保证自己赢得游戏。
        int n = piles.size();
        vector<int> res(n, 1);
        for (int i = 0; i < n; ++i) {
            if (piles[i] % 4 == 0) {
                res[i] = 0;
            }
        }
        return res;
    }
};