頭良くなりたい人

文系大学生shadeのブログです。競技プログラミングや人文学の話題,受験ネタなど。

AGC014 A - Cookie Exchanges

問題はこちら
atcoder.jp

方針

言われた操作を記述するだけですが,while内を単に

…
a=b/2+c/2;
b=c/2+a/2;
c=a/2+b/2;
…

などとしてしまわないように注意。きれいな漸化式なのでやりたくなります。
「無限回操作が行える \Leftrightarrow 有限回の操作後,初期状態に戻る」と解釈しています(証明はしていません)。

コード

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    int a_ini,b_ini,c_ini;      //A,B,Cの初期値
    cin>>a_ini>>b_ini>>c_ini;
 
    int a=a_ini;
    int b=b_ini;
    int c=c_ini;
 
    int count=0;
 
    int a_temp,b_temp,c_temp;
 
    while(a%2==0 && b%2==0 && c%2==0){
        a_temp=a;
        b_temp=b;
        c_temp=c;
        a=b_temp/2+c_temp/2;
        b=c_temp/2+a_temp/2;
        c=a_temp/2+b_temp/2;
        count++;
        if(a==a_ini && b==b_ini && c==c_ini){
            count=-1;
            break;
        }
    }
 
    cout<<count<<endl;
}