WC模拟(1.2) T3 取石子

标签: 省选 结论分析
151人阅读 评论(0) 收藏 举报
分类:

取石子

题目背景:

1.2 WC模拟T3

分析:结论分析

 

见到n堆石子 à 肯定是博弈啊

见到AliceBob玩游戏 à 肯定是博弈啊

看到无法操作者输 à 肯定是博弈啊

然后今天死成了智障······原来,三者合一还可以结论分析······

考虑,我们不妨设a < b,对于每堆石子,先对a + b取模,显然对于一堆石子如果它大于a + b一方取了,另一方可以直接跟上,所以相当于没有意义。那么取模之后可以分为4种情况。

(1) xi < a,对于答案没有影响

(2) a <= xi < b,只要存在一定是a胜利(b只能取其他的,a也取其他的,知道最后再用这一堆就可以了)

(3) b <= xi < 2 * a,相当于只能取一次,结合(4)分析奇偶性

(4) 2 * a <= xi,如果存在至少两个则a必胜(不管先手后手,一定能将其中至于取成(2)状态),如果存在一个且(3)为奇数个则a必胜(若a先手,直接变成(2),如果是后手,一共偶数堆,一人一堆取即可),存在1个且(3)为偶数个则先手胜(讨论先手的情况就可以清楚发现),如果不存在则(3)为奇数个先手必胜,(3)为偶数个后手必胜。

 

Source:

 

/*
	created by scarlyw
*/
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <cctype>
#include <vector>
#include <set>
#include <queue>
#include <ctime>
#include <bitset>

inline char read() {
	static const int IN_LEN = 1024 * 1024;
	static char buf[IN_LEN], *s, *t;
	if (s == t) {
		t = (s = buf) + fread(buf, 1, IN_LEN, stdin);
		if (s == t) return -1;
	}
	return *s++;
}

///*
template<class T>
inline void R(T &x) {
	static char c;
	static bool iosig;
	for (c = read(), iosig = false; !isdigit(c); c = read()) {
		if (c == -1) return ;
		if (c == '-') iosig = true;	
	}
	for (x = 0; isdigit(c); c = read()) 
		x = ((x << 2) + x << 1) + (c ^ '0');
	if (iosig) x = -x;
}
//*/

const int OUT_LEN = 1024 * 1024;
char obuf[OUT_LEN], *oh = obuf;
inline void write_char(char c) {
	if (oh == obuf + OUT_LEN) fwrite(obuf, 1, OUT_LEN, stdout), oh = obuf;
	*oh++ = c;
}

template<class T>
inline void W(T x) {
	static int buf[30], cnt;
	if (x == 0) write_char('0');
	else {
		if (x < 0) write_char('-'), x = -x;
		for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48;
		while (cnt) write_char(buf[cnt--]);
	}
}

inline void flush() {
	fwrite(obuf, 1, oh - obuf, stdout);
}

/*
template<class T>
inline void R(T &x) {
	static char c;
	static bool iosig;
	for (c = getchar(), iosig = false; !isdigit(c); c = getchar())
		if (c == '-') iosig = true;	
	for (x = 0; isdigit(c); c = getchar()) 
		x = ((x << 2) + x << 1) + (c ^ '0');
	if (iosig) x = -x;
}
//*/

int mod = 1000000000 + 7;
int n, a, b, x;
int cnt[4], ans[4];
bool flag;

inline int mod_pow(int a, int b) {
	int ans = 1;
	for (; b; b >>= 1, a = (long long)a * a % mod)
		if (b & 1) ans = (long long)ans * a % mod;
	return ans;
}

int main() {
	freopen("stone.in", "r", stdin);
	freopen("stone.out", "w", stdout);
	R(n), R(a), R(b);
	if (a > b) std::swap(a, b), flag = true;
	for (int i = 1; i <= n; ++i) {
		R(x), x %= (a + b);
		if (x < a) cnt[0]++;
		else if (x >= a && x < b) cnt[1]++;
		else if (x >= b && x < 2 * a) cnt[2]++;
		else cnt[3]++;
	}
	ans[0] = (long long)mod_pow(2, cnt[0]) * 
			((long long)(mod_pow(2, cnt[1]) - 1) * mod_pow(2, cnt[2] + cnt[3]) % mod
			 + (long long)mod_pow(2, cnt[2]) * (mod_pow(2, cnt[3]) - 1 - cnt[3]) % mod
			 + (long long)cnt[3] * (cnt[2] ? mod_pow(2, cnt[2] - 1) : 0) % mod) % mod;
	ans[1] = 0;
	ans[2] = (long long)mod_pow(2, cnt[0]) *  
			((long long)cnt[3] * (cnt[2] ? mod_pow(2, cnt[2] - 1) : 1) % mod
			 + (long long)(cnt[2] ? mod_pow(2, cnt[2] - 1) : 0)) % mod;
	ans[3] = (long long)mod_pow(2, cnt[0]) * 
			(long long)(cnt[2] ? mod_pow(2, cnt[2] - 1) : 1) % mod;
	if (flag) std::swap(ans[0], ans[1]);
	for (int i = 0; i < 4; ++i) 
		ans[i] = (ans[i] + mod) % mod, std::cout << ans[i] << " ";
	return 0;
}
查看评论

JZOJ 3819. 【NOI2015模拟9.9】取石子

JZOJ 3819. 【NOI2015模拟9.9】取石子 DescriptionInputOutputSample Input3 3 1 1 2 2 3 4 3 2 3 5Sample O...
  • liyizhixl
  • liyizhixl
  • 2018-02-07 21:38:52
  • 69

NOI2017模拟3.8 总结

先看题目名字A,B,字符串。最后一题居然是字符串题,那就先看最后一题。一开始还以为是套路题,但是发现询问居然都是独立的,而且乍一看是O(qm)O(qm)的,直接爆炸。考虑之前做过一道是要设阈值的题。就...
  • YxuanwKeith
  • YxuanwKeith
  • 2017-03-08 20:19:32
  • 660

JZOI【NOI2017模拟3.30】轮回

Description掌管着世界的暗流的是一个叫做Samjia的人。 他看到所有人的生死,他看见所有人一世又一世的轮回,而他却从未把握过自己的命。 在无法估计的命中,他看见那些轮回,他很好奇,这一...
  • qq_35866453
  • qq_35866453
  • 2017-03-30 20:17:38
  • 317

Ration和深蓝的下午茶:取石子游戏&异或和

下午茶的时候,Ration在和他的计算姬玩一个游戏:取石子游戏:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了...
  • qq_33346538
  • qq_33346538
  • 2017-08-23 16:29:44
  • 206

取石子(二)

取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 小王喜欢与同事玩一些小游戏,今天他们选择了玩取石子。 游戏规则如下:共...
  • u012629369
  • u012629369
  • 2014-05-13 21:23:24
  • 530

NYOJ 取石子总结

nyoj的取石子有好多道,除了两道难度为6的,剩下的在这儿简单总结一下结论。  取石子(一)      有一堆石子共有n个,A和B轮流取,A先,每次最少取1个,最多取m个,先取完者胜,A,B足够聪...
  • AcmLzq
  • AcmLzq
  • 2016-04-21 19:31:24
  • 3217

取石子(一) (南阳理工oj 题目23)

题目链接  http://acm.nyist.net/JudgeOnline/problem.php?pid=23 取石子(一) 时间限制:3000 ms  |  内存限制:65535...
  • jiyi_xiaoli
  • jiyi_xiaoli
  • 2017-08-07 18:59:56
  • 291

算法——博弈论:取石子游戏

有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下...
  • runningtortoises
  • runningtortoises
  • 2012-12-05 17:09:05
  • 1007

取石子(七)(NYOJ 833)

取石子(七) 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和Hrd...
  • u013207805
  • u013207805
  • 2014-01-06 20:45:06
  • 1807

hdu 2176 取(m堆)石子游戏(博弈,异或运算)

题意:http://acm.hdu.edu.cn/showproblem.php?pid=2176 这也就是nim game(异或理论)。但是要求出“先取者第1次取子的所有方法. 如果从有a个石...
  • theArcticOcean
  • theArcticOcean
  • 2015-06-12 15:13:40
  • 622
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 2万+
    积分: 2169
    排名: 2万+
    博客专栏
    最新评论