题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)
前言
比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ
和dummyummy巨佬一起推了快三个小时的规律
最后去问了真正的巨佬__stdcall
__stdcall面带微笑的告诉我们,这是SG函数的板子题
QwQ
被卡科技了
体验极差
正文
题目
链接:https://www.nowcoder.com/acm/contest/161/B
来源:牛客网
题目描述
现在小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[];
int qz[],hz[],n,a[],SG[]={},f[];
int ans=,maxa;
void sg(void){
for(int i=;i<=n;i++)
for(int j=;j<=sqrt(a[i]);j++)
if(a[i]%j==){
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=;i<=n;i++)
scanf("%d",&a[i]),maxa=max(a[i],maxa);
SG[]=;
for(int i=;i<=maxa;i++) {
int tt;
for(int k=,j=;;j*=,k+=) {
if(i%j==*(j/)||i%j==*(j/)) tt=k-;
if(i%j==*(j/)) tt=k;
if(i%j!=) break;
}
SG[i]=tt;
}
sg();
// for(int i=0;i<=maxa;i++)
// printf("SG[%d]=%d\n",i,SG[i]);
for(int i=;i<=n;i++)
qz[i]=qz[i-]^SG[a[i]];
for(int j=n;j>=;j--)
hz[j]=hz[j+]^SG[a[j]];
for(int i=;i<=n;i++){
for(int j=;j<g[i].size();j++)
if(!((qz[i-]^hz[i+])^SG[a[i]-g[i][j]]))
ans++;
}
printf("%d",ans);
return ;
}
题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)的更多相关文章
- Wannafly挑战赛23 T2游戏 SG函数
哎,被卡科技了,想了三个小时,最后还是大佬给我说是\(SG\)函数. \(SG\)函数,用起来很简单,证明呢?(不可能的,这辈子都是不可能的) \(SG\)定理 游戏的\(SG\)函数就是各个子游戏的 ...
- 牛客网 Wannafly挑战赛9 C.列一列-sscanf()函数
C.列一列 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288K64bit IO Format: %lld 链接:https://www.now ...
- 牛客网 Wannafly挑战赛8 A.小Y和小B睡觉觉
写了一会不想写了... A-小Y和小B睡觉觉 链接:https://www.nowcoder.com/acm/contest/57/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制: ...
- 牛客网 Wannafly挑战赛 C 列一列 简单题 (题目有点坑)
链接:https://www.nowcoder.com/acm/contest/71/C来源:牛客网 题目描述 小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An.尽管他计算 ...
- 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)
链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客网 Wannafly挑战赛27 蓝魔法师
蓝魔法师 链接: https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔 ...
- 牛客网 Wannafly挑战赛8 B.LBJX的三角形
B-LBJX的三角形 链接:https://www.nowcoder.com/acm/contest/57/B来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K, ...
- 牛客网 Wannafly挑战赛11 B.白兔的式子-组合数阶乘逆元快速幂
链接:https://www.nowcoder.com/acm/contest/73/B来源:牛客网 B.白兔的式子 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K, ...
- 牛客网 Wannafly挑战赛11 A.白兔的分身术
水一水博客. 链接:https://www.nowcoder.com/acm/contest/73/A来源:牛客网 A.白兔的分身术 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
随机推荐
- Windsor
https://github.com/castleproject/Windsor https://github.com/castleproject/Windsor/blob/master/docs/R ...
- 泛型List、HashTable
从最开始接触的数组,到非泛型集合类(ArrayList.HashTable.Queue.Stack).泛型集合类(List<T>.Dictionary<T>.Queue< ...
- 使用函数式编程消除重复无聊的foreach代码(Scala示例)
摘要:使用Scala语言为例,展示函数式编程消除重复无聊的foreach代码. 难度:中级 概述 大多数开发者在开发生涯里,会面对大量业务代码.而这些业务代码中,会发现有大量重复无聊的 foreach ...
- redis相关问题
什么是Redis?Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...
- Java注解的原理
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述 ...
- python模板字符串和格式化字符串
模板字符串:用string模块里的Template Template()里面把字符串中某个值用设置变量${key}的方式先写好,然后在substitute()的方式把变量用其他值代替,就完成了字符串的 ...
- Codeforce 791A - Bear and Big Brother
Bear Limak wants to become the largest of bears, or at least to become larger than his brother Bob. ...
- <转>jmeter(六)元件的作用域与执行顺序
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- Django框架----权限管理(设计分析以及具体细节)
说起权限我们大家都知道,不一样的角色会有不一样的权限.比如就像学生管理系统一样,管理员,老师,学生之间的权限都是不一样的,那么展示的页面也是不一样的.所以,我们现在来看看具体操作. 目标:生成一个独立 ...
- Kali linux apt-get update 失败,无release……(最有效)
设置源 编辑 /etc/apt/sources.list nano /etc/apt/sources.list 清空文件内所有内容后添加 deb http://mirrors.ustc.edu.cn/ ...