[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})
n = 6 时 (E = {1,2,3,4,5,6})
n = 7 时 (E = {1,2,3,4,5,6,7})
n = 8 时 (E = {1,2,3,4,5,6,7,8})
n = 9 时 (E = {1,2,3,4,5,6,7,8,9})
n = 10 时 (E = {1,2,3,4,5,6,7,8,9,10})
发现:
- n为奇数时胜负情况为BBAABBAABBAAB……
- 此时不会公平(F)。对 K/2 向上取整或四舍五入后, 结果是奇数时对B有利;反之对A有利
- n为偶数时胜负情况为FB FA FB FA FB FA……
- 此时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; }
感觉你的博客好棒~