前言

比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ

和dummyummy巨佬一起推了快三个小时的规律

最后去问了真正的巨佬__stdcall

__stdcall面带微笑的告诉我们,这是SG函数的板子题

QwQ

被卡科技了

体验极差

正文

题目

链接:https://www.nowcoder.com/acm/contest/161/B
来源:牛客网

题目描述

小N和小O在玩游戏。他们面前放了n堆石子,第i堆石子一开始有ci颗石头。他们轮流从某堆石子中取石子,不能不取。最后无法操作的人就输了这个游戏。但他们觉得这样玩太无聊了,更新了一下规则。具体是这样的:对于一堆有恰好m颗石子的石头堆,假如一个人要从这堆石子中取石子,设他要取石子数为d,那么d必须是m的约数。最后还是无法操作者输。
现在小N先手。他想知道他第一步有多少种不同的必胜策略。一个策略指的是,从哪堆石子中,取走多少颗石子。只要取的那一堆不同,或取的数目不同,都算不同的策略。

输入描述:

第一行一个整数n。接下来一行n个整数,分别代表每堆石子的石子数目。数据保证输入的所有数字都不超过\( 10^{5} \),均大于等于1,且为整数。

输出描述:

一行一个整数代表小$N$第一步必胜策略的数量。

输入

10
47 18 9 36 10 1 13 19 29 1

输出

7

题解

题目让求第一步必胜策略的数量

那就是求第一步走后有多少个状态是必败态

组合的Nim游戏模型

求出SG函数,然后枚举每个数和它的约数

累加一下ans

完毕

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
vector<int> g[100001];
int qz[100001],hz[100002],n,a[100001],SG[100001]={0},f[100001];
int ans=0,maxa;
void sg(void){for(int i=1;i<=n;i++)for(int j=1;j<=sqrt(a[i]);j++)if(a[i]%j==0){if(a[i]/j==j)g[i].push_back(j);else{g[i].push_back(j);g[i].push_back(a[i]/j);}}return;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),maxa=max(a[i],maxa);SG[0]=0;for(int i=1;i<=maxa;i++) {int tt;for(int k=2,j=4;;j*=4,k+=2) {if(i%j==1*(j/4)||i%j==3*(j/4)) tt=k-1;if(i%j==2*(j/4)) tt=k;if(i%j!=0) break;}SG[i]=tt;}sg();
//    for(int i=0;i<=maxa;i++)
//        printf("SG[%d]=%d\n",i,SG[i]);for(int i=1;i<=n;i++)qz[i]=qz[i-1]^SG[a[i]];for(int j=n;j>=1;j--)hz[j]=hz[j+1]^SG[a[j]];for(int i=1;i<=n;i++){for(int j=0;j<g[i].size();j++)if(!((qz[i-1]^hz[i+1])^SG[a[i]-g[i][j]]))ans++;}printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/9570194.html

题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)相关推荐

  1. 牛客网 Wannafly挑战赛8 A.小Y和小B睡觉觉

    写了一会不想写了... A-小Y和小B睡觉觉 链接:https://www.nowcoder.com/acm/contest/57/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制 ...

  2. 牛客网 Wannafly挑战赛20 A-染色

    链接:https://www.nowcoder.com/acm/contest/133/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. 牛客网 Wannafly挑战赛27 蓝魔法师

    蓝魔法师 链接: https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔 ...

  4. 牛客网wannafly挑战赛13-D(贪心)

    链接:https://www.nowcoder.com/acm/contest/80/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  5. 牛客网wannafly挑战赛13-E(线段树)

    链接:https://www.nowcoder.com/acm/contest/80/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)

    传送门 :B题:点我 C题: 点我 题目描述 有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数 输入描述: 第一行n 第二行n个数,表示每个队伍的人 ...

  7. [牛客网Wannafly挑战赛24F]wyf的超级多项式

    Description 已知 F i = ∑ j = 1 k a j v j i F_i=\sum_{j=1}^{k}a_jv_j^i Fi​=∑j=1k​aj​vji​ 给出 v 1.. k v1. ...

  8. 牛客网Wannafly挑战赛29 B - 白井黑子 乱搞

    Description kuroko 作为常盘台唯一的空间系能力者,在每年例行的能力测试中可绝对不能让 misaka 失望哦,但是由于她的等级只是 level 4「大能力者」,在能力测试中会遇到不少困 ...

  9. 牛客网Wannafly挑战赛4(割草机)

    点击打开链接 思路:不管怎么走,都必须从第一个有'W'的行走到最后一个有'W'的行,对于每一行,都必须处理完这行所有的'W',如果在奇数行,那就应该走到这行和下一行有W的最右边,再往下走,如果在偶数行 ...

最新文章

  1. Java实现均摊_Java均摊复杂度和防止复杂度的震荡原理分析
  2. 不想 CRUD 干到老,就来看看这篇 OOM 排查的实战案例!
  3. ueditor百度富文本编辑器linux下报错: class path resource [config.json] cannot be resolved to absolute file path
  4. Flink SQL 1.11 新功能与最佳实践
  5. finalize到底是什么
  6. python 函数默认参数的小坑
  7. 永擎服务器主板稳定性,主板看不停 Computex2015华擎展台一览
  8. 数据结构与算法的分析
  9. 【转】数据库范式(1NF 2NF 3NF BCNF)详解二
  10. 升级php5.5.10扩展不兼容
  11. mysql建表语句外键_mysql里面用语句怎么建立表外键的命令
  12. 南阳理工acm 1007GCD
  13. 汇编语言和本地代码及通过编译器输出汇编语言的源代码
  14. 快讯:迈阿密在建公寓计划为飞行汽车推出天空港口
  15. Android 经典系统 HTC One 802d国行电信专版/最新Viper2.6.0/永久root/强大的功能、高级设置/纯净省电ROM
  16. 两数求和(C语言超简单解法)
  17. intel服务器无线网卡,刷版本号?Intel再发新版无线网卡驱动
  18. 亚马逊运营推热新品的一些技巧分享值得卖家们收藏!
  19. 名帖80 苏轼 楷书《南轩梦语》
  20. 抖音号永久封禁了怎么解封

热门文章

  1. Linux 定时任务没有执行
  2. UFS 3 - UFS RPMB
  3. STemWin专题--图形化窗口的简单制作
  4. metal slug java_【进化史】合金弹头进化史 Metal Slug Games (1996-2020)
  5. AOC1952 显示屏 输入不支持
  6. RichTextBox控件
  7. mysql 三个表内连接查询_MySQL多表查询详解
  8. python解析XML文件报错 entity not defined Entity ndash not defined
  9. 公告页面制作html,群公告编辑页面.html
  10. whmcs license.php,免费永久WHMCS授权(套用Hostgator)申请及使用教程