JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi
http://172.20.6.3/Problem_Show.asp?id=1540
之前莫比乌斯反演也写了一道这种找规律分块计算的题,没觉得这么恶心啊。
具体解释看代码。
翻硬币的具体方法就是分别算出每个单个正面朝上的情况的sg函数然后异或。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<ctime>
using namespace std;
int n,k,w,mx;
int f[][]={};//n/x和n/(n/x)代表的x的sg值,分成两部分使得储存需要的空间开根
//值得注意的是,这两种划分方式分出的x的范围是一定的,大概是数字的性质。
int vis[]={};
int doit(int x,int y){return x==y?x+:y/(y/(x+));}
int main(){
scanf("%d%d",&n,&k);
//暴力代码
/*for(int i=n;i>=1;i--){
int now=0;
for(int j=i+i;j<=n;j+=i){
now^=f[j];vis[now]=i;
}
for(int j=1;;j++){
if(vis[j]!=i){
f[i]=j;
break;
}
}
}*/
/*暴力打表后可以发现这个东西满足规律:
只要n/x(向下取整)相等sg值就相等。
于是就开始了漫长艰辛的分块计算之旅
倒数真有趣
_
| |
| |
_ _| |_ _
| | | | | |
\_________/
*/
mx=(int)sqrt(double(n));
for(int i=;i<=n;i=doit(i,n)){//这里枚举的i从小到大,其实是n/x
int y,now=,z;
for(int j=;j<=i;j=doit(j,i)){//上一层枚举了n/x,这一层用同样的方式枚举他的倍数
y=i/j;//既然用n/x表达,扩大j倍自然是/j。
z=y<=mx?f[y][]:f[n/y][];
vis[now^z]=i;
if((i/y-i/(y+))&)now^=z;
//如果在范围里有偶数个z,那算下一个的范围的时候z就被自己消掉了所以不用算。
}
for(int j=;;j++){//大家喜闻乐见的mex时间
if(vis[j]!=i){
if(i<=mx)f[i][]=j;else f[n/i][]=j;
break;
}
}
}
for(int i=;i<=k;i++){
scanf("%d",&w);int x,ans=;
for(int i=;i<=w;i++){
scanf("%d",&x);
x=n/x;
ans^=x<=mx?f[x][]:f[n/x][];//喜闻乐见的异或时间
}
if(ans)printf("Yes\n");//喜闻乐见的判定时间
else printf("No\n");
}
return ;
}
JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi的更多相关文章
- 【基础操作】博弈论 / SG 函数详解
博弈死我了……(话说哪个小学生会玩博弈论提到的这类弱智游戏,还取石子) 先推荐两个文章链接:浅谈算法——博弈论(从零开始的博弈论) 博弈论相关知识及其应用 This article was updat ...
- POJ2425 A Chess Game[博弈论 SG函数]
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3917 Accepted: 1596 Desc ...
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- [BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】
题目链接:BZOJ - 1188 题目分析 我们把每一颗石子看做一个单个的游戏,它的 SG 值取决于它的位置. 对于一颗在 i 位置的石子,根据游戏规则,它的后继状态就是枚举符合条件的 j, k.然后 ...
- [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
题目链接:BZOJ - 1874 题目分析 这个是一种组合游戏,是许多单个SG游戏的和. 就是指,总的游戏由许多单个SG游戏组合而成,每个SG游戏(也就是每一堆石子)之间互不干扰,每次从所有的单个游戏 ...
- 【GZOI2015】石子游戏 博弈论 SG函数
题目大意 有\(n\)堆石子,两个人可以轮流取石子.每次可以选择一堆石子,做出下列的其中一点操作: 1.移去整堆石子 2.设石子堆中有\(x\)个石子,取出\(y\)堆石子,其中\(1\leq y&l ...
- [2016北京集训试题6]魔法游戏-[博弈论-sg函数]
Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...
- 2016多校联合训练1 B题Chess (博弈论 SG函数)
题目大意:一个n(n<=1000)行,20列的棋盘上有一些棋子,两个人下棋,每回合可以把任意一个棋子向右移动到这一行的离这个棋子最近的空格上(注意这里不一定是移动最后一个棋子),不能移动到棋盘外 ...
- POJ 2960 S-Nim 博弈论 sg函数
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...
随机推荐
- form表单有条件的提交
form表单提交数据,比如,积分,score,在0--100之间 var score = $('#score').val(); if(score !=''){ if(isNaN(score)){ la ...
- Use JPath but not recursively loop a JObject to modify the values.
I am dealing with a Json file, I parsed it into jObject, I have another list which flattened the pro ...
- 【洛谷 P1502】 窗口的星星(扫描线)
题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...
- RMQ之ST求区间最大值
题目链接:https://cn.vjudge.net/problem/HRBUST-1188 每一次按照二进制的方式进行更新,二维数组dp [i] [j],i表示下标,j表示从i 开始的往后移动2的j ...
- Python ctypes中cast/py_object用法
class ctypes.py_object Represents the C PyObject * datatype. Calling this without an argument create ...
- php-fpm性能优化
PHP-fpm PHP-FPM是一个PHPFastCGI管理器,是只用于php的. php-fpm 已经在 Linux.MacOSX.Solaris 和 FreeBSD 上测试通过. 确信 libxm ...
- 4B/5B编码原理
4B/5B编码原理 什么是4B/5B编码? 4B/5B编码是百兆以太网(即快速以太网)中线路层编码类型之一,就是用5bit的二进制数来表示4bit二进制数,映射方式如下表所示: 为什么要进行4B/5B ...
- 64_n1
NFStest-2.1.5-0.fc26.noarch.rpm 16-Feb-2017 16:19 544018 NLopt-2.4.2-11.fc26.i686.rpm 13-Feb-2017 23 ...
- 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
之前介绍过关于HBase 0.9.8版本的部署及使用,本篇介绍下最新版本HBase1.2.4的部署及使用,有部分区别,详见如下: 1. 环境准备: 1.需要在Hadoop[hadoop-2.7.3] ...
- leetcode 之Valid Sudoku(七)
判断行.列.九宫格内数字是否重复. 按照行.列.九宫格进行检查即可. bool validSudoku(const vector<vector<char>>& boar ...