Codeforces Round #726 (Div. 2) D. Deleting Divisors(博弈,思维)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #726 (Div. 2) D. Deleting Divisors(博弈,思维)相关的知识,希望对你有一定的参考价值。

LINK

题意

A A A B B B轮流做游戏m初始有个数字 n n n

每次选择 n n n的的一个因子 x x x,其中 x ! = 1 & & x ! = n x!=1\\&\\&x!=n x!=1&&x!=n

然后令 n = n − x n=n-x n=nx,重复,直到哪一方无法操作(是质数),哪一方输


首先, s g sg sg打表很容易看出规律

然后我想你应该是想知道为什么,那就继续看吧


Ⅰ.当 n n n为奇数时, A l i c e Alice Alice只能减去奇数因子 D D D,设 n = r ∗ D n=r*D n=rD

那么 n − D n-D nD是个偶数,且 n − D ! = 2 k n-D!=2^k nD!=2k,因为 ( r − 1 ) ∗ D ! = 2 k (r-1)*D!=2^k (r1)D!=2k(前者的 D D D并不能为分解为 2 2 2的次幂)

所以此时 B o b Bob Bob得到的 n − D n-D nD是偶数且具有奇数因子,那么再次减去奇数因子返回奇数给对手

A l i c e Alice Alice总是被迫返回偶数 f f f B o b Bob Bob,且 f f f是具有奇数因子的偶数

所以 A l i c e Alice Alice总是拿到奇数,而质数总是奇数,所以输的是 A l i c e Alice Alice

但是特例 2 2 2也是质数,不过前面说到 B o b Bob Bob每次拿到的都是具有奇数因子的偶数

所以不存在这种情况


Ⅱ.如果 n n n为偶数且具有奇数因子,那么 A l i c e Alice Alice使用同样的方法可以赢


Ⅲ.如果 n n n为偶数且没有奇数因子,也就是 n = 2 k n=2^k n=2k

那么 A l i c e Alice Alice只能减去 2 k 1 2^{k_1} 2k1,显然 2 k − 2 k 1 2^k-2^{k_1} 2k2k1仍然是一个偶数

分解为 2 k 1 ( 2 k − k 1 − 1 ) 2^{k_1}(2^{k-k_1}-1) 2k1(2kk11),如果 2 k − k 1 − 1 2^{k-k_1}-1 2kk11包含奇数因子那么 A l i c e Alice Alice就输了

所以 A l i c e Alice Alice唯一的选择是令 k 1 = k − 1 k_1=k-1 k1=k1, B o b Bob Bob同理

每次把 n n n缩小一半,所以此时只需要比较 k k k的奇偶性质即可

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int maxn = 3e5+10;
int n;
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		scanf("%d",&n );
		int x = 0,f = n;
		while( f%2==0 )	x++,f/=2;
		if( n&1 )	cout << "Bob\\n";
		else if( f!=1 || ( x%2==0 ) )	cout << "Alice\\n";
		else	cout << "Bob\\n"; 
	}
	return 0;
}

以上是关于Codeforces Round #726 (Div. 2) D. Deleting Divisors(博弈,思维)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #726 (Div. 2) 6-18

Codeforces Round #726 (Div. 2) D题解

Codeforces Round #726 (Div. 2)(补题)

Codeforces Round #726 (Div. 2) A. Arithmetic Array

Codeforces Round #726 div.2 A-F题解

Codeforces Round #726 div.2 A-F题解