51Nod-1831-小C的游戏
2017-07-15 01:59
197 查看
ACM模版
这个题,没有多想,直接打表,打表后发现胜败和是否为素数有一定的关系,于是又加了一个素数筛,然后打表(代码 One)的结果如下:
此时,打表的范围在 1e3 内,于是又尝试打表 1e4 以内,发现结果依然没有什么变化,于是大胆猜测,是否只有这几个值特别?其他都是符合规律的?哦,忘了说规律了,素数差不多都是 0,而合数差不多都是 1,打表的具体结果告诉我们,素数中除了 2、17 都是 0,而合数除了 1、16、34、289 都是 1,当然,这个既不是素数又不是偶数的 0 结果也是 0,那么直接几个判断就能解决(代码 Two)啊~~~
对了,1 是 TAK,0 是 NIM。
Two:
描述
题解
先吐个槽,题面有毒,这题的出题人或者翻译人语文水平堪忧啊……这里说的分成几等分只取其中一份有问题,应该是只留下其中的一份,剩下的全部拿走。真是无语=_=这个题,没有多想,直接打表,打表后发现胜败和是否为素数有一定的关系,于是又加了一个素数筛,然后打表(代码 One)的结果如下:
此时,打表的范围在 1e3 内,于是又尝试打表 1e4 以内,发现结果依然没有什么变化,于是大胆猜测,是否只有这几个值特别?其他都是符合规律的?哦,忘了说规律了,素数差不多都是 0,而合数差不多都是 1,打表的具体结果告诉我们,素数中除了 2、17 都是 0,而合数除了 1、16、34、289 都是 1,当然,这个既不是素数又不是偶数的 0 结果也是 0,那么直接几个判断就能解决(代码 Two)啊~~~
对了,1 是 TAK,0 是 NIM。
代码
One:#include <cstdio> #include <cmath> #include <cstring> using namespace std; const int MAXN = 10000; bool flag[MAXN]; /* * 素数筛选,判断小于MAXN的数是不是素数 * notprime是一张表,false表示是素数,true表示不是 */ bool notprime[MAXN]; void init() { memset(notprime, false, sizeof(notprime)); notprime[0] = notprime[1] = true; for (int i = 2; i < MAXN; i++) { if (!notprime[i]) { if (i > MAXN / i) // 阻止后边i * i溢出(或者i,j用long long) { continue; } // 直接从i * i开始就可以,小于i倍的已经筛选过了 for (int j = i * i; j < MAXN; j += i) { notprime[j] = true; } } } memset(flag, 0, sizeof(flag)); for (int i = 2; i < MAXN; i++) { flag[i] |= (!flag[i - 1]); if (flag[i]) { continue; } int tmp = sqrt(i) + 1; for (int j = 2; j <= tmp; j++) { if (i % j == 0) { flag[i] |= (!flag[j]); flag[i] |= (!flag[i / j]); if (flag[i]) { break; } } } } } int main() { init(); for (int i = 0; i < MAXN; i++) { if (notprime[i] && flag[i] == 0) { printf("%d-%d\n", i, flag[i]); } else if (!notprime[i] && flag[i] == 1) { printf("%d-%d\n", i, flag[i]); } } return 0; }
Two:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int n; bool is_prime(int x) { if (x < 2) { return false; } int tmp = sqrt(x) + 1; for (int i = 2; i < tmp; i++) { if (x % i == 0) { return false; } } return true; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &n); bool flag = false; if (is_prime(n)) { if (n == 2 || n == 17) { flag = !flag; } } else { if (n > 2 && n != 16 && n != 34 && n != 289) { flag = !flag; } } puts(flag ? "TAK" : "NIE"); } return 0; }
相关文章推荐
- 51nod 1831:小C的游戏
- 51nod 1831: 小C的游戏(Bash博弈 找规律)
- 51Nod 1831 小C的游戏
- 51nod 1831 小C的游戏
- 51nod 1831 小C的游戏
- 51nod-1831 小C的游戏
- 51nod-1072威佐夫游戏
- 51nod 1441 士兵的数字游戏【素数筛】
- 51Nod 1536 不一样的猜数游戏
- 1069 Nim游戏(51NOD基础)
- 51nod-1417 天堂里的游戏
- 51nod 1067 Bash游戏 V2
- 51nod 1070 Bash游戏 V4(博弈——找规律)
- 51nod 1714 B君的游戏
- 51Nod_1067Bash游戏 V2
- 51Nod-1417-天堂里的游戏
- 51nod 1180 方格射击游戏
- 51nod【1381】硬币游戏【思维】
- 51Nod 1381 硬币游戏
- 51Nod 1068 Bash游戏 V3 找规律