当前位置: 代码迷 >> 综合 >> 【博弈论:倒腾思维】D. Deleting Divisors——Codeforces Round #726 (Div. 2)
  详细解决方案

【博弈论:倒腾思维】D. Deleting Divisors——Codeforces Round #726 (Div. 2)

热度:14   发布时间:2023-11-21 17:05:21.0

https://codeforces.com/contest/1537/problem/D

博弈论:倒腾

  • 1.n为非合数就会输
  • 2.让n变为非合数的会赢
  • 3.(需要想法)奇数好像可以变成非合数。奇数的因子是奇数,得到偶数
  • 4.由于该奇数是m(奇)* n(奇)变为m * n-m=m(奇)(n-1)(偶)偶数,所以又可以减m变为奇数m(n-2),迟早会减为非合数的。

至此,奇数输,(奇)*(偶)赢

  • 5.只剩下不能分解成(奇)*(偶)的了,必是2的幂次。
  • 6.由于2输,2n要么减半要么减不到一半,如果不到一半,那又是非2n的(奇)*(偶)给对方赢。所以只能选减半还有希望。于是2^k是k为奇数则输,k为偶数则赢。

综上,输:奇数,2n且n为奇数。赢相反。

#include<iostream>
#ifdef LOCAL
FILE* FP = freopen("text.in", "r", stdin);
#endif
using namespace std; 
int t, n, c;
signed main() {
     scanf("%d", &t);while (t--) {
    scanf("%d", &n);c = 0;while (!(n & 1)) {
    n >>= 1;++c;}printf("%s\n", (!c || (n == 1 && (c & 1))) ? "Bob" : "Alice");}
}
  相关解决方案