51Nod 1185 威佐夫游戏 V2
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 10^18)
Output
共T行,如果A获胜输出A,如果B获胜输出B。
Input示例
3 3 5 3 4 1 9
Output示例
B A A
说实话,要不是看题解,真的是不知道还有这样的一种减少精度的做法。还是要多练。
//Asimple #include <bits/stdc++.h> //#define INF 0x3fffffff #define swap(a,b,t) t = a, a = b, b = t #define CLS(a, v) memset(a, v, sizeof(a)) #define debug(a) cout << #a << " = " << a <<endl #define test() cout<<"=========="<<endl using namespace std; typedef long long ll; const int maxn = 50000+5; const double PI=acos(-1.0); const ll mod = 1000000000; const int INF = ( 1 << 20 ) ; const int dx[] = {-1, 0, 1, 0}; const int dy[] = { 0,-1, 0, 1}; ll n, m, res, ans, len, T, k, num, sum, t; ll te[] = {618033988,749894848,204586834}; //ll mod; void input() { ios_base::sync_with_stdio(false); cin >> T; while( T -- ){ cin >> n >> m; if( n>m ) { t = n; n = m; m = t; } res = m-n; k = res/mod, t = res%mod; sum = t*te[2]; sum = k*te[2]+t*te[1]+sum/mod; sum = k*te[1]+t*te[0]+sum/mod; sum = res+k*te[0] + sum/mod; if( sum == n ) cout << "B" << endl; else cout << "A" << endl; } } int main(){ input(); return 0; }