ABC019_C

2で割り切れたら割り続けて集合に入れる.
2で割り切るのは右ビットシフトと同義

a[i] /= 2;
a[i] = a[i]>>1;

a[i] =>>1;//これはダメ
a[i]>>1;//これもダメ

解答

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
static const int MAX_N = 100000;
set<int> S;
int a[MAX_N];
int main(){
    int n;cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++){
        while(a[i]>1 && !(a[i]%2)){//2で割り続ける
            a[i]=a[i]>>1;
        }
        S.insert(a[i]);
    }
    cout<<(int)S.size()<<endl;
    return 0;
}