AtCoder Beginner Contest 100

はい。
https://beta.atcoder.jp/contests/abc100

A - Happy Birthday!

C++

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%s\n",(a<9 && b<9)?"Yay!":":(");
 
    return 0;
}

多分どちらかが8より大きいと連続する2切れを取ってしまうと思う。なのでそれを判定条件にすれば大丈夫だと思う。

B - Ringo's Favorite Numbers

C++

#include<bits/stdc++.h>
using namespace std;
 

int main(){
    int d,n;
    scanf("%d %d",&d,&n);
    if (n==100) n++;
    if (d==0) {
        printf("%d\n",n);
    } else if (d==1) {
        printf("%d\n",n*100);
    } else {
        printf("%d\n",n*10000);
    }
    return 0;
}

入出力例の通りに1,2,3...とかで適当に数える。但しn=100の時だけ少し例外になる。

C - *3 or /2

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,ans=0,tmp=0;
    scanf("%d",&n);
    vector<long long> a(n);
    for (auto&e:a) scanf("%d",&e);
    for (int i=0;i<n;i++) {
        tmp=0;
        long long k=a[i];
        for(;;) {
            if (k>=1 && k%2==0) {
                k/=2;
                tmp++;
            } else {
                break;
            }
        }
        ans+=tmp;
    }
    printf("%d\n",ans);
    return 0;
}

先に解説を見てしまったけどもその前に小さいケースで色々確認して自分で気づくべきだった。。掛ける3は何がどうなっても割る2が出来なかったものが出来るようにはならないので、数列全体で割る2が出来るものを1つだけするのを繰り返すことになる。掛ける3はシミュする意味はないのでひたすら割る2が出来る回数だけ調べてその和が解になる。