Problem:
Score : 400 points

Problem Statement

Snuke has one biscuit and zero Japanese yen (the currency) in his pocket.
He will perform the following operations exactly K times in total, in the order he likes:

Hit his pocket, which magically increases the number of biscuits by one.

Exchange A biscuits to 1 yen.

Exchange 1 yen to B biscuits.

Find the maximum possible number of biscuits in Snuke's pocket after K operations.

Constraints

1 \leq K,A,B \leq 10^9

K,A and B are integers.

Input

Input is given from Standard Input in the following format:

K A B

Output

Print the maximum possible number of biscuits in Snuke's pocket after K operations.

Sample Input 1

4 2 6

Sample Output 1

7

The number of biscuits in Snuke's pocket after K operations is maximized as follows:

Hit his pocket. Now he has 2 biscuits and 0 yen.

Exchange 2 biscuits to 1 yen. his pocket. Now he has 0 biscuits and 1 yen.

Hit his pocket. Now he has 1 biscuits and 1 yen.

Exchange 1 yen to 6 biscuits. his pocket. Now he has 7 biscuits and 0 yen.

Sample Input 2

7 3 4

Sample Output 2

8

Sample Input 3

314159265 35897932 384626433

Sample Output 3

48518828981938099

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define rep(i, n) for(int i=0; i<n; i++)

using namespace std;

int main(){
  long long K, A, B;
  cin >> K >> A >> B;
  //入力終了

  long long ans = 0;
  
  //操作回数の上限より1円交換に必要なビスの方が多い
  if(K < A){
    cout << K+1 << endl;
    return 0;
  }
  //円を経由するよりも直接ビスにした方が効率が良い
  if(A+2 > B){
    cout << K+1 << endl;
    return 0;
  }
    
  //1回目の操作
  K = K-(A-1);   //初めに1個持っている
  K--;           //Aビスを1円に
  ans += B; K--; //1円をBビスに

  if(K >= A+2){
    long long change_count;
    //AビスがBビスに変わるが，A<BよりBビスの一部を使って操作を繰り返せる
    //よって，操作を繰り返せる回数は，Aビス->1円，1円->Bビスの2回の操作を
    //何回繰り返せるかによる
    change_count = K/2;
    
    //必要な操作回数を引く
    K = K-(change_count*2);
    //AビスをBビスにchange_count回変換できる
    ans = ans+( (B-A)*change_count); 
  }

  //残った操作回数は全てビスに回す
  ans += K;

  //解答
  cout << ans << endl;
  
  return 0;
}