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& ...
随机推荐
- Spirng MVC +Velocity 表单绑定命令对象
通常,表单中的数据在提交之后可以通过Spring MVC的@RequestParam注解在控制器函数的参数列表中中提取出来,但是一旦表单数据过多的话,参数列表将会变得非常长,最好的解决方案是将表单中的 ...
- jQuery 几款比较棒的插件
jQuery滚动监听插件Waypoints 博客分类: Javascript /Jquery / Bootstrap / Web 你是否希望当用户仅仅滚动滑条的时候,就能触发各种各样的动态效果呢? ...
- NGUI利用深度测试实现新手引导遮罩
实现原理:实际上就是先利用渲染队列渲染,然后再利用ZTest,改变渲染的遮挡关系. PS:Depth Testing:深度测试,也叫深度缓冲.只有最靠近观察者的物体会被绘制.深度即Z,该值越小表示离观 ...
- Spring data jpa中Query和@Query分别返回map结果集
引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...
- Node.js——路径问题
相对路径问题:读取文件,形如 ./ 或者 ../ 一般认为这个点是相对于这个 js 文件的文件夹路径,实际上不是,这个点相对于node命令时的当前路径,不同 js 文件下进行 ./ 这样的引入是不 ...
- vue2.0 动态切换组件
组件标签是Vue框架自定义的标签,它的用途就是可以动态绑定我们的组件,根据数据的不同更换不同的组件. <!DOCTYPE html> <html lang="en" ...
- rem手机端页面自适应布局(待修正下一篇完美布局)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- bootstrap 整理
form-control 输入框,独占一行,占满. form-group 增加下边距 <label> 字体会加粗,不是独占一行 .col-xs- 超小屏 .col-sm- 平板 . ...
- Matrix (二分套二分
Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i ...
- faster rcnn结构
rpn-data层输入的是data即整张图片,然后是根据映射生成roi框 rpn-loss-bbox输入的才是整个网络预测的roi框 bbox_transform在rpn-data层使用,把生成的ac ...