题目链接在这里:G-Deleting Divisors_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题 (nowcoder.com)

这道题一道比较明显的思路是使用sg函数,因为可以看到比较明显的一个状态推到另一个状态的过程。在考场上的话应该想到的是通过sg函数打表找规律来做。

 1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=100005;
4 int n;
5 int sg[MAX];
6 int main(){
7 int i,j;
8 memset(sg,0,sizeof(sg));
9 for (i=2;i<=1000;i++)
10 for (j=2;j*j<=i;j++)
11 if (i%j==0){
12 if (sg[i-j]==0 || sg[i-i/j]==0)
13 sg[i]=1;
14 }
15 for (i=1;i<=1000;i++)
16 cout<<i<<" : "<<sg[i]<<endl;
17 return 0;
18 }

下面是正解:

通过分解质因数然后观察可以看出这个和奇偶性是有关系的,我们就来考虑两种状态:

1. 如果当前数为一个奇数,那么它的所有因子一定是奇数,所以它减掉一个因子一定是一个偶数,即它的下一状态要么是已经寄了,要么是第二状态。

2. 如果当前数是一个偶数,并且不为2的次幂,那么它一定能转成第一状态,因为假设当前数为m*2^k,那么我们减去一个m,剩下的数必定为m*(2^k-1),两个奇数相乘必定是奇数。

综上,我们看到,在2状态下必胜,只有在1状态下在会输。

现在我们来看一下2的次幂怎么做,2的次幂要么转成1,要么转成2,因为转成2必胜,所以当前操作肯定是为了转成1,所以就是每次除以2,这就要看2上面的指数的奇偶了。

所以我们判断里两个,对于非2的次幂奇数必败,偶数必胜。对于2的次幂,指数奇数必败,指数偶数必胜。

 1 #include "bits/stdc++.h"
2 using namespace std;
3 int t;
4 int n;
5 int check(int x){
6 int i,j,an=0;
7 while (x%2==0){
8 an++;
9 x/=2;
10 }
11 return x==1?an:0;
12 }
13 int main(){
14 int i,j,an;
15 scanf("%d",&t);
16 while (t--){
17 scanf("%d",&n);
18 if (n%2==1) cout<<"Bob"<<endl;
19 else{
20 an=check(n);
21 if (an==0 || an%2==0) cout<<"Alice"<<endl;
22 else cout<<"Bob"<<endl;
23 }
24 }
25 return 0;
26 }

博弈论练习6 Deleting Divisors(sg找规律,思维)的更多相关文章

  1. Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)

    大意: 给定$n$堆石子, 两人轮流操作, 每次操作两种选择 $(1)$任选非空堆拿走一个石子 $(2)$任选石子数为$2x(x>0)$的一堆, 替换为$k$堆$x$个石子. ($k$给定) 最 ...

  2. Gym 101147A The game of Osho(SG找规律)

    https://vjudge.net/problem/Gym-101147A 题意:给出G组数,每组数包括两个数B,N,两玩家轮流取数,使得N-num,num<=N并且num是N的整次幂.判断谁 ...

  3. 【博弈论】【SG函数】【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) E. Game of Stones

    打表找规律即可. 1,1,2,2,2,3,3,3,3,4,4,4,4,4... 注意打表的时候,sg值不只与剩下的石子数有关,也和之前取走的方案有关. //#include<cstdio> ...

  4. BZOJ-1228 E&D 博弈SG+找啊找啊找规律

    讨厌博弈,找规律找半天还是错的.... 1228: [SDOI2009]E&D Time Limit: 10 Sec Memory Limit: 162 MB Submit: 666 Solv ...

  5. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  6. LA 5059 (找规律 SG函数) Playing With Stones

    题意: 有n堆石子,两个人轮流取,每次只能取一堆的至少一个至多一半石子,直到不能取为止. 判断先手是否必胜. 分析: 本题的关键就是求SG函数,可是直接分析又不太好分析,于是乎找规律. 经过一番“巧妙 ...

  7. HDU-4664 Triangulation 博弈,SG函数找规律

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的 ...

  8. bzoj 1228 [SDOI2009]E&D(sg函数,找规律)

    Description 小E 与小W 进行一项名为“E&D”游戏.游戏的规则如下:桌子上有2n 堆石子,编号为1..2n.其中,为了方便起见,我们将第2k-1 堆与第2k 堆(1 ≤ k ≤ ...

  9. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  10. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...

随机推荐

  1. vvv动态组件和keep-alive

    <!DOCTYPE html><html> <head> <style> </style> <script src="a.j ...

  2. vue仿QQ聊天室|vue聊天实例,直播聊天室

    图片压缩 百亿站点 基于vue2.0+vue-cli+vuex+vue-router+webpack+es6+wcPop等技术开发的仿微信聊天界面|仿微信聊天室vue-chatRoom,实现了微信聊天 ...

  3. redis acl 修改密码

    #redis acl 修改密码 acl setuser readwrite on >111111111 ~* &* +@allacl setuser readonly on >11 ...

  4. holiday11

    holiday11--linux basis From today I will write my note in English ,hope I will stick to it. user and ...

  5. 逆向学习物联网-网关ESP8266-04系统联合调试

    1.测试平台原理 2.搭建硬件测试平台 3.软件测试平台 1)串口终端 2)串口监视 3)OneNET后台服务 https://open.iot.10086.cn/passport/login/ 户名 ...

  6. python菜鸟学习: 8. 集合基础知识

    # -*- coding: utf-8 -*-# 列表的特性:1,去重:2.关系测试list1 = [1, 4, 6, 8, 7, 8, 9]# 集合去重list2 = set(list1)print ...

  7. nodejs express 服务代理

    //方法1 var proxy = require('express-http-proxy'); app.use('/map', proxy('https://test.baidu.com/', { ...

  8. 如何使用C++代码实现1-100之间的素数

    #include "pch.h" #include <iostream> using namespace std; int main() { cout << ...

  9. DER编码

    1. Attribute Type编码 ​ 对于标识串,采用低标识编码方式,只需1个字节.OBJECT IDENTIFIER的 tag为Ox06;class选择universal,则位8和位7为0,O ...

  10. Vue 防抖节流获取this问题

    1. 防抖 debounce(func, delay = 500) { let _this = this; let args = arguments; return (function () { if ...