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

浙公网安备 33010602011771号