zoukankan      html  css  js  c++  java
  • CodeForces-1537D Deleting Divisors 博弈

    CodeForces-1537D Deleting Divisors 博弈

    题意

    给定数(n),每次可以删除(n)的除了1和本身以外的因子,如果不能操作就算输

    分析

    这题从删去的因子的奇偶性来讨论比较方便

    将数分为三类:
    1.奇数

    2.偶数且(n = 2^k)

    3.偶数且(n eq 2^k)

    若是奇数,那么它的因子都是奇数,且减去一个奇数因子后就会变为偶数且( eq 2^k) ,而我们总是希望给出的数是奇数,因为无法移动的局面一定是1或者质数的局面,而除2以外所有质数都是奇数

    若是偶数且(n eq 2^k) 我们一定会减去奇因子让它变成局面1

    因此如果是局面1 必败,如果是局面3 必胜

    如果是局面2,显然每次只能减去(2^{k_1})(2^k- 2^{k_1} = 2^{k_1}(2^{k-k_1}))是偶数,一定不希望转移到局面3,因此只能令(k - k_1 = 1) ,因此这种情况只要讨论(k)的奇偶性

    代码

    #include<bits/stdc++.h>
    #define pii pair<ll,ll>
    #define fi first
    #define se second
    
    using namespace std;
    typedef long long ll;
    typedef vector<int> VI;
    
    inline ll rd(){
        ll x;
        scanf("%lld",&x);
        return x;
    }
    
    const int MOD = (int)1e9 + 7;
    
    inline int mul(int a,int b){
        int res = (ll)a * b % MOD;
        if(res < 0) res += MOD;
        return res;
    }
    
    
    inline void sub(int &a,int b){
        a -= b;
        if(a < 0) a += MOD;
    }
    
    
    inline int ksm(int a,int b = MOD - 2,int m = MOD){
    	int ans = 1;
    	int base = a;
    	while(b){
    		if(b & 1) ans = mul(ans,base);
    		base = mul(base,base);
    		b >>= 1;
    	}
    	return ans;
    }
    
    int main(){
    	int T = rd();
    	while(T--){
    		int n = rd();
    		if(n & 1) {
    			puts("Bob");
    		}
    		else if(((n - 1) & n) == 0){
    			int cnt = __builtin_popcount(n - 1);
    			if(cnt & 1) puts("Bob");
    			else puts("Alice");
    		}	
    		else puts("Alice");
    	}
    }
    
  • 相关阅读:
    liunx各命令及全称
    window启动数据库服务命令
    拉取github指定分支上的代码
    python项目学习
    客户展示 增删改查
    登录 注册功能 表梳理
    java简历
    go语言数组
    go语言 变量作用域
    go语言函数
  • 原文地址:https://www.cnblogs.com/hznumqf/p/15189749.html
Copyright © 2011-2022 走看看