zoukankan      html  css  js  c++  java
  • Codeforces 850C

    850C - Arpa and a game with Mojtaba

    题意

    两个人玩游戏。初始给出一些数字,每次操作要求选择两个数 ((p,k)) 使得 (p^k) 是某个数的因子,其中 (p) 是素数,(k) 是正整数。然后将所有包含这个因子的数除去这个因子,谁不能操作谁输。

    分析

    博弈问题。
    注意到素数之间是无关联的,所以单独考虑每一个素数即可。对每一个素数计算(sg)值,最后全部异或起来即可。
    (sg)函数相关讲解:关于 Nim 游戏与 SG 函数 的一点研究
    对于每一个素数,可以用一个二进制数 (x) 表示每一个次幂的因子是否存在。初始必败态 (sg[0] = 0),每一个状态的后继状态为 ((x gg (i + 1)) | (x & ((1 ll i) - 1)))

    code

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int MAXN = 1e5 + 10;
    int not_prime[MAXN];
    vector<int> prime;
    vector<int> nl[MAXN];
    void init() {
        for(int i = 2; i < MAXN; i++) {
            if(!not_prime[i]) {
                prime.push_back(i);
                for(ll j = 1LL * i * i; j < MAXN; j += i) {
                    not_prime[j] = 1;
                }
            }
        }
    }
    map<int, int> sg;
    int dfs(int x) {
        if(!x) return 0;
        else if(sg.count(x)) return sg[x];
        set<int> s;
        for(int i = 0; i < 32; i++) if(x >> i)
            s.insert(dfs((x >> (i + 1)) | (x & ((1 << i) - 1))));
        for(int i = 0; ; i++) {
            if(!s.count(i)) return sg[x] = i;
        }
    }
    map<int, set<int> >  mp;
    int main() {
        init();
        int n;
        cin >> n;
        for(int i = 0; i < n; i++) {
            int x;
            cin >> x;
            for(auto p : prime) {
                if(x % p == 0) {
                    int c = 0;
                    while(x % p == 0) {
                        c++;
                        x /= p;
                    }
                    mp[p].insert(c);
                }
                if(!x) break;
            }
            if(x > 1) mp[x].insert(1);
        }
        int ans = 0;
        for(auto i : mp) {
            int x = 0;
            for(auto j : i.second) {
                x |= (1 << (j - 1));
            }
            ans ^= dfs(x);
        }
        cout << (!ans ? "Arpa" : "Mojtaba") << endl;
        return 0;
    }
    
  • 相关阅读:
    设计模式 设计原则 何为设计
    面向对象 多态
    两个简易的对拍程序
    各类有用的神奇网站
    乘法逆元
    树链剖分
    Markdown的用法
    vimrc 的配置
    luogu【P1144】最短路计数
    【娱乐】收录各种神奇知乎问答
  • 原文地址:https://www.cnblogs.com/ftae/p/7610744.html
Copyright © 2011-2022 走看看