読者です 読者をやめる 読者になる 読者になる

紙媒体で管理するとなくなりがちなのでブログで進捗などを管理することにしました
※殆どの記事は自分自身のためだけにかいています.他人に見せられるレベルには至っていません...

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