Олимпидная задача на С++
День добрый. Прошу, помогите с задачей. Условие ниже:
Вова большой любитель оригами. Для складывания бумажного самолетика ему понадобилось сложить гармошку размера 1 на 1 из листа клетчатой бумаги размера N на M. Сгибать бумагу Вова может только по линиям разлиновки. Например, если N = 3, a M = 1, то последовательность действий для сгиба выглядите так:
Выведите минимальное кол-во сгибов для получения гармошки.
Есть 2 примера ввода - вывода:
INPUT
2 2
OUTPUT
2
INPUT
5 3
OUTPUT
5
Вот мой код, на нем все три теста проходят(плюс банальный тест 1 1), а вот дальше - никак.
#include <string>
#include<vector>
using namespace std;
typedef long long ll;
int main(){
ll h, w; cin >> h >> w;
if(h == 1 || w == 1){
cout << max(h, w) - 1 << endl;
}
else{
ll a = h, b = w;
ll c1 = 0, c2 = 0;
while(a != 1){
if(a % 2){ a--; c1++;}
else{a /= 2; c1++;}
}
c1 += (b - 1);
while(w != 1){
if(w % 2){w--; c2++;}
else{w/=2; c2++;}
}
c2+=(h-1);
cout << min(c1, c2) << endl;
}
}
По ограничениям: N <= 1000 >= M;
