#2021暑假杭电多校8_1006.GCD Game(Nim博弈)

1006.GCD Game

题目传送门!

题目大意:

给定 n 个数字。他们轮流操作,每次进行以下操作。

  1. 任意选择其中一个数字 a i a_i ai
  2. 任意找一个 x ( 1 ≤ x < a i ) x(1≤x<a_i) x(1x<ai)
  3. 将数字 a i a_i ai替换为 g c d ( a i , x ) g c d ( a_i , x ) gcd(ai,x)

思路:

筛选质因子个数,然后Nim博弈。
先打个线性的表。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e7 + 1000;
bool is_prime[maxn];
ll prime[maxn], cnt = 0, fac[maxn];
void euler(int p)
{
    is_prime[0] = is_prime[1] = 1;
    for (ll i = 2; i <= p; ++i)
    {
        if (!is_prime[i])
            prime[++cnt] = i, fac[i] = 1;
        for (ll j = 1; j <= cnt && i * prime[j] <= p; ++j)
        {
            is_prime[i * prime[j]] = true;
            fac[i * prime[j]] = 1 + fac[i];
            if (i % prime[j] == 0)
                break;
        }
    }
}
int main()
{
    euler(maxn - 100);
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        ll sg = 0;
        for (int i = 1; i <= n; i++)
        {
            int x;
            scanf("%d",&x);
            sg ^= fac[x];
        }
        if (sg)
            printf("Alice\n");
        else
            printf("Bob\n");
    }
}

Nim博弈:

Nim博弈:
题意:
有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。
分析:
当(0,0,0)时,为必败局。
当(0,0,1)时,为必胜局 。
当(0,0,2)时,为必胜局 。

所以,将所有的石子进行异或操作,当异或值为 0时 ,后者必胜 ,否者,前者必胜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释代码 #加载数据 path_absolute_log = r"F:\数据处理比赛\BDC2023\处理数据log" paths_log_file = os.listdir(path_absolute_log) #获取绝对路径 def make_paths_absolute(paths_file): path_absolute = path_absolute_log paths_absolute_file = os.path.join(path_absolute,paths_file) return paths_absolute_file paths_absolute_log_file = list(map(make_paths_absolute,paths_log_file)) #对表格处理 path_absolute_log_file = r"F:\数据处理比赛\BDC2023\处理数据log\4ff8b802-0d87-11ee-af51-525400d4ffe4_log.csv" def form_data(path_absolute_log_file): data_log = pd.read_csv(path_absolute_log_file) data_log.insert(data_log.shape[1], 'id_score', np.nan) data_log.insert(data_log.shape[1], 'id', os.path.basename(path_absolute_log_file)[:-8]) data_log_message = data_log['message'] def jieba_data(data): data_log_jieba_message = [] data_log_jieba_message.append(','.join(jieba.cut_for_search(data))) print(data_log_jieba_message) return data_log_jieba_message data_log_jieba_message = data_log_message.map(jieba_data) def form_work(data): feature_words = ['bug','ERROR','WARNING','error','WARN','empty','错误','失败','未登录'] set_data = set(str(data)[2:-2].split(',')) set_feature_words = set(feature_words) set_mysql = set('mysql') score = [] if set_data.intersection(set_feature_words): score.append() if set_mysql.intersection(set_feature_words): score.append('LTE4MDK5Mzk2NjU1NiM1ODIONDC=') score = str(score)[2:-2] print(score) return score data_log['id_score'] = data_log_jieba_message.map(form_work) return data_log data_log = form_data(path_absolute_log_file)
07-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值