Division Game UVA - 11859 除法游戏 Nim

题目链接 

有一个nXm (1 运n.m 豆50) 矩阵,每个元素均为2-10000 之间的正整数。两个游戏者轮流操作。每次可以选→行中的1 个或多个大于1 的整数,把它们中的每个数都变成它的某个真因子,比如12 可以变成1 , 2, 3, 4 或者6 ,不能操作的输(换句话说,如果在谁操作之前,矩阵中的所有数都是1,则他输〉。
分析:考虑每个数包含的素因子个数(比如12=2x2x3 包含3 个素因子) ,则让一个数 "变成它的真因子"等价于拿掉它的一个或多个素因子。这样,每行对应一个火柴堆,每个数的每个素因子看成一根火柴,则本题就和Nim 游戏就完全等价了。

#include <cstdio>
#include <cmath>

int getPrimeCnt(int x){  
	int cnt = 0;
	int n = sqrt(x + 0.5);
	for(int i = 2; i <= n; i++){	
		while(x % i == 0){
			 x /= i;
			 cnt++;
		}
	}
	if(x > 1) cnt++;
	return cnt;
}

int main(int argc, char** argv) {
	int T, kase = 0;
	scanf("%d",&T);
	for(int kase = 1; kase <= T; kase++){
		int n, m;
		scanf("%d%d",&n,&m);
		int ans = 0;
		for(int i = 0; i < n; i++){
			int sum = 0, x; 
			for(int j = 0; j < m; j++){
				scanf("%d",&x);
				sum += getPrimeCnt(x); 
			}
			ans ^= sum;
		}
		printf("Case #%d: %s\n", kase, ans ? "YES" : "NO");
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章