A. Array Elimination

A. Array Elimination

题目大意:

​ 一个数组有n个数,你可以进行若干次参数为k的“操作”使数组归零。输出所有可能的k。

​ “操作”:选择数组中的任意k个元素做两两与,得到x。再对这k个元素减掉x。

思路:

​ 要全部归零,就是每一个数字的每一个二进制位都要变0 。而and操作是全1出1,有0出0的。用题中样例做个例子:

25 & 19 = 10001 ,就能把16下面的两个1删掉了。以此类推,题目就变成求每一列上1的数量的最大公约数。这个最大公约数就是答案的上界。

void solve(){
	
	cin >> n ;
	
	ll maxx = -1 , gcdd = 0 , f = 0 ;
	for(int i = 1 ; i <= n ; i ++ ){
		cin >> a[i] ;
		if(a[i]) f = 1 ;
	}
	
	if(!f){//全0特判
		for(int i = 1 ; i <= n ; i ++ ) cout << i << " " ; cout << "\n" ;
		return ;
	}
	
	for(int i = 0 ; i <= 31 ; i ++ ){
		ll cnt = 0 ;
		for(int j = 1 ; j <= n ; j ++ )
			if( a[j] & (1 << i) ) cnt ++ ;
		gcdd = gcd(gcdd , cnt) ;
	}
	
	for(int i = 1 ; i <= gcdd ; i ++ )//最大公约数是上界
		if(gcdd % i == 0) cout << i << " " ; cout << "\n" ;
	
}
posted @ 2021-10-29 20:45  tyrii  阅读(86)  评论(0)    收藏  举报