[C/C++]无聊的游戏

题目 :A、B两人玩下面的游戏:从集合E={1,2,...,n}中随机取k个数。若这k个数的和是偶数,则A获胜;否则B获胜。请你判断游戏对谁有利。
输入:第一行为一个整数T,表示数据组数。接下来T行,每行包含两个正整数n,k(k<=n<=10^9),用空格隔开。
输出:对于每组数据,若游戏对A有利,输出A,若对B有利,输出B,若游戏公平,输出F。每个答案一行。
示例输入:
2
1 1
2 1

示例输出:

B
F

来源bnuoj contest 5727A

观察:

n = 5 时 (E = {1,2,3,4,5})

5

n = 6 时 (E = {1,2,3,4,5,6})

6

n = 7 时 (E = {1,2,3,4,5,6,7})

7

n = 8 时 (E = {1,2,3,4,5,6,7,8})

8

n = 9 时 (E = {1,2,3,4,5,6,7,8,9})

9

n = 10 时 (E = {1,2,3,4,5,6,7,8,9,10})

10

发现:

  1. n为奇数时胜负情况为BBAABBAABBAAB……
  2. 此时不会公平(F)。对 K/2 向上取整或四舍五入后, 结果是奇数时对B有利;反之对A有利
  3. n为偶数时胜负情况为FB FA FB FA FB FA……
  4. 此时K为奇数时公平(F)。K为4的倍数时对A有利,剩下的对B有利

背后的黑科技不清楚

#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char const *argv[])
{
	long long sum, i;
	cin >> sum;
	for(i = 0; i < sum; i++)
	{
		long long n, k;
		cin >> n >> k;

		if(!(n%2)) //n为偶
		{
			if(!(k%4))
			{
				cout << "A" << endl;
				continue;
			}
			else if(!(k%2))
			{
				cout << "B" << endl;
				continue;
			}
			else
			{
				cout << "F" << endl;
				continue;
			}
		}
		else
		{
			if( !( ((long long)ceil(k/2.)) % 2) ) //偶数组
			{
				cout << "A" <<endl;
				continue;
			}
			else
			{
				cout << "B" << endl;
				continue;
			}
		}
	}
	return 0;
}

 

标签: none

仅有一条评论

  1. 感觉你的博客好棒~

添加新评论