Problem:
Score : 300 points

Problem Statement

Takahashi, Aoki and Snuke love cookies. They have A, B and C cookies, respectively. Now, they will exchange those cookies by repeating the action below:

Each person simultaneously divides his cookies in half and gives one half to each of the other two persons.

This action will be repeated until there is a person with odd number of cookies in hand.

How many times will they repeat this action?
Note that the answer may not be finite.

Constraints

1 ≤ A,B,C ≤ 10^9

Input

Input is given from Standard Input in the following format:

A B C

Output

Print the number of times the action will be performed by the three people, if this number is finite.
If it is infinite, print -1 instead.

Sample Input 1

4 12 20

Sample Output 1

3

Initially, Takahashi, Aoki and Snuke have 4, 12 and 20 cookies. Then,

After the first action, they have 16, 12 and 8.

After the second action, they have 10, 12 and 14.

After the third action, they have 13, 12 and 11.

Now, Takahashi and Snuke have odd number of cookies, and therefore the answer is 3.

Sample Input 2

14 14 14

Sample Output 2

-1

Sample Input 3

454 414 444

Sample Output 3

1

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Numerics;
using System.IO;
using System.Runtime.InteropServices;
using static System.Math;
using static Math2;
using static io;
using static Utils;

public class CompetitiveProgramming
{
  public void Solve()
  {
    var o = Ints;
    var A = o[0];
    var B = o[1];
    var C = o[2];
    long ans = 0;

    while (true)
    {
      if (A % 2 == 1 || B % 2 == 1 || C % 2 == 1) break;
      if (A == B && B == C)
      {
        Write(-1);
        return;
      }
      var a = A;
      var b = B;
      var c = C;
      A = (a + b) / 2;
      B = (c + b) / 2;
      C = (a + c) / 2;
      ans++;
    }
    Write(ans);
  }
}


public static class Math2
{
  public const int INF = 1 << 29;
  public const long INFL = 1L << 60;
  public const long MOD = 1000000007;
  public const int MOD2 = 998244353;

  public static long Power(long i, long N, long MOD = 1000000007)//i^N
  {
    long res = 1;
    while (N > 0)
    {
      if ((N & 1) != 0) res = res * i % MOD;
      i = i * i % MOD;
      N >>= 1;
    }
    return res;
  }
  public static long Power2(long i, long N)//i^N
  {
    long res = 1;
    while (N > 0)
    {
      if ((N & 1) != 0) res = res * i;
      i = i * i;
      N >>= 1;
    }
    return res;
  }
  public static long GCD(long i, long N)
  {
    if (i > N) Swap(ref i, ref N);
    if (i == 0) return N;
    while (N != 0)
    {
      var r = i % N;
      i = N;
      N = r;
    }
    return i;
  }
  public static long LCM(long i, long N) => i * N / GCD(i, N);
  public static long Comb(long N, long R, int MOD = 1000000007)
  {
    long ret = 1;
    long x = 1;
    for (long i = N; i >= N - R + 1; --i)
    {
      ret = ret / x * i;
      ret %= MOD;
      x++;
    }
    return ret;
  }
  public static long Comb2(long N, long R)
  {
    long Nume = 1;
    long Deno = 1;

    if (R > N - R) Swap(ref N, ref R);
    for (long i = 1; i <= R; ++i)
    {
      Deno *= i;
      Nume *= N - i + 1;
    }
    return Deno / Nume;
  }

}
public static class Utils
{

  public static void Swap<T>(ref T A, ref T B)
  {
    T x = A;
    A = B;
    B = x;
  }
  public static int DigitSum(int N)
  {
    string s = N.ToString();
    int ret = 0;
    for (int i = 0; i < s.Length; ++i) ret += s[i] - '0';
    return ret;
  }
}
class Program
{
  static void Main(string[] args)
  {
    var CompetitiveProgramming = new CompetitiveProgramming();
    CompetitiveProgramming.Solve();
  }
}
public static class io
{
  public static string Str => Console.ReadLine();
  public static string[] Strs => Str.Split(' ');
  public static long[] Longs => Strs.Select(long.Parse).ToArray();
  public static int[] Ints => Strs.Select(int.Parse).ToArray();
  public static char[] Chars => Str.ToArray();
  public static double[] Doubles => Strs.Select(double.Parse).ToArray();
  public static long Long1 => Longs[0];
  public static int Int1 => Ints[0];
  public static char Char1 => Chars[0];
  public static double Double1 => Doubles[0];
  public static long[] VerticalRead(int N) { long[] A = new long[N]; for (int i = 0; i < N; ++i) A[i] = Long1; return A; }
  public static void Write(string a) => Console.WriteLine(a);
  public static void Write(params object[] i) => Write(string.Join(" ", i));
  public static void Write<T>(IEnumerable<T> a) => Write(string.Join(" ", a));
  public static void Verticalwrite<T>(IEnumerable<T> a) { foreach (var z in a) Write(z); }
  public static void YN(bool i) { if (i) Write("Yes"); else Write("No"); }
}