codeforces 88E Interesting Game
题目大意:
两个好朋友再将一堆物品分堆,每次都将一堆物品分成数量连续的至少两个堆,直到一个人不能分堆为输
第一次做博弈问题,看了百度文库的http://wenku.baidu.com/link?url=C6qxEhqBEJJFDPC2nSW8kaOer2s_WyOxAhUi0QzF_-B38Gw7KqbbjFvuiaLUvuoGYtliZE_JAH_PO1VPpOT1Vo5OvbyPzBR3Q5IlmWYIHuy
感觉讲的还是蛮好的
这里因为每次至少要分两个堆
所以初始sg[0] = sg[1] = sg[2] = 0 ,为 P 态(必胜态)
假设某堆物品n可以分成a , a+1 , a+2 , a+3 ... a+k-1 这样k堆
根据等差数列方程可得 (2*a+k-1)*k = 2*n
那么我们就可以找所有 可作为 2*n的因子的k , 这里因为a>=1 ,所以(2*a+k-1)>k的,所以只要找2~sqrt(2*n+0.5)中符合的k的因子就好了,然后判断里面的a是否存在
如果都成立说明这是一种分的方式,这就是一个n的可到达点,记录当前的点sg值已访问过,当前点的sg值是由这个点中所有堆的异或值得到
我们这里异或过程中不断记录异或的前缀和减少计算过程
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int N = ; int sg[N] , sum[N] , minn[N] , vis[N]; void init_sg()
{
sg[] = sg[] = sg[] = ;
sum[] = sum[] = sum[] = ;
memset(minn , 0x3f , sizeof(minn));
for(int n= ; n<= ; n++){
int t = *n;
int factor = (int)(sqrt(t+0.5));
for(int k= ; k<=factor ; k++){
if(t % k == && t/k+-k> && !((t/k+-k)&)){
int a = (t/k+-k)/;
int p = sum[a+k-]^sum[a-];
vis[p] = n;
if(p == ) minn[n] = min(minn[n] , k);
}
}
//找没有出现过的最小的sg函数
int v = ;
while(){
if(vis[v] != n){
sg[n] = v;
break;
}
v++;
}
//记录当前的sum[]前缀
sum[n] = sum[n-]^sg[n];
}
} int main()
{
// freopen("a.in" , "r" , stdin);
init_sg();
int n;
while(scanf("%d" , &n) == )
{
if(!sg[n]){
puts("-1");
continue;
}
printf("%d\n" , minn[n]);
}
return ;
}
codeforces 88E Interesting Game的更多相关文章
- Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...
- codeforces 482B. Interesting Array【线段树区间更新】
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...
- 【二分】Codeforces 706B Interesting drink
题目链接: http://codeforces.com/problemset/problem/706/B 题目大意: n (1 ≤ n ≤ 100 000)个商店卖一个东西,每个商店的价格Ai,你有m ...
- Codeforces 482B Interesting Array(线段树区间更新)
题目链接 Interesting Array 区间更新.然后对于每一个约数重新求一遍区间的&值,不符合就跳出. #include <bits/stdc++.h> using nam ...
- Codeforces - 706B - Interesting drink - 二分 - 简单dp
https://codeforces.com/problemset/problem/706/B 因为没有看见 $x_i$ 的上限是 $10^5$ ,就用了二分去做,实际上这道题因为可乐的价格上限是 $ ...
- Codeforces E. Interesting Array(线段树)
题目描述: D. Interesting Arraytime limit per test1 secondmemory limit per test256 megabytesinputstandard ...
- CodeForces - 706B Interesting drink(二分查找)
Interesting drink Problem Vasiliy likes to rest after a hard work, so you may often meet him in some ...
- CodeForces 706B Interesting drink (二分查找)
题意:给定 n 个数,然后有 m 个询问,每个询问一个数,问你小于等于这个数的数有多少个. 析:其实很简单么,先排序,然后十分查找,so easy. 代码如下: #pragma comment(lin ...
- CodeForces 706B Interesting drink
排序,二分. 将$x$数组从小到大排序,每次询问的时候只要二分一下位置就可以了. #pragma comment(linker, "/STACK:1024000000,1024000000& ...
随机推荐
- 题解报告:hdu 1228 A+B(字符串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1228 Problem Description 读入两个小于100的正整数A和B,计算A+B. 需要注意 ...
- Linux磁盘分区、格式化和挂载
一.查看磁盘使用 [root@iZ88rvassw1Z ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G .3G 3 ...
- Eclipse快捷键集合
***eclipse查看哪个方法被调用:选中,右键选择Open call Hierarchy 选择要查看的方法: ctrl + alt + h 查看一个类被那些类继承或者实现: F ...
- RabbitMQ五:生产者--队列--多消费者
一.生成者-队列-多消费者(前言) 上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图 P 生产者 C 消费者 中间队列 ...
- jstat命令-帮助优化java性能
jstat命令使用 jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
- 使用一个CSS Class去给标签定义Style
使用一个CSS Class去给标签定义Style 类是可重用的样式,可以添加到HTML元素. 下面是一个CSS类声明的例子: <style> .blue-text { colo ...
- rar在linux下安装更新
1.下载:根据主机系统下载合适的版本,当前64为centos系统演示下载: wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz 2.解压安 ...
- org.springframework.orm.hibernate4.support.OpenSessionInterceptor
/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Vers ...
- pdf 使用模板下载
//根据模板下载模板 /** * * 政策5-8条的创建的pdf的模板 */public String createPdfCashTemplate(PdfCashParam pdfCashParam) ...
- CSS hover 改变另外一个元素状态
Part.1 问题 我们写页面时也不少遇到这个问题,在没有使用任何预处理语言前提下,当hover 一个元素的时候怎么改变其它的元素? 这里我把它分为两种情况(除自身以外) hover时 1: 改变本身 ...