D. Deleting Divisors

https://codeforces.com/contest/1537/problem/D

题意:给定数n,alice和bob博弈,alice先手。每次操作可以减去当前n的一个因子,并且该因子不能为n和1。问谁必胜。

思路:策略分析。基础分析:如果n是奇数,那么没有偶数因子。如果n是偶数,可能有偶数因子和奇数因子,如果只有偶数因子,n是2的整数次方。如果n是奇数,n要么是质数,要么一次操作后变成偶数。所以如果先手alice是奇数,必败。考虑偶数的情况,如果有奇数因子,那么一次操作后变成奇数,此时相当于奇数先手,所以bob必败。如果只有偶数因子,那么每次操作必须减去(n / 2)这个因子,假如减去了n / 4这个因子,可能会出现包含了奇数的偶数,那么此时就处于一个必败态了,比如8 - 2 = 6。所以此时看谁先拿到质因子2,谁拿到质因子2,谁就必败,统计二进制下末尾0的数量。如果是奇数个bob必胜。

总结:很巧妙的分析题,需要分析每种情况才行,一开始完全没有任何想法,纯纯的暴力找了个没逻辑的规律,不出意外tc2就挂了。

/*
  偶数,有奇因子,那么alice必胜。
  偶数,没有奇因子,说明是2的整数次方。此时的策略必须是减去最大的因子,(1 << (k -1)),否则相减后出现奇数因子必败。
        所以该情况下看谁拿到2,谁输。
  奇数,必败。
*/

void solve(){
    int n;
    cin >> n;

    if (n & 1){
        cout << "Bob\n";
    }
    else{
        if (__builtin_popcount(n) == 1 && (__builtin_ctz(n) & 1)){
            cout << "Bob\n";
        }
        else{
            cout << "Alice\n";
        }
    }
}
posted @   _Yxc  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示