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;
}

 

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