const
  maxN = 1000000;
  inf = 1000000000;

var
  n, a, b: longint;
  f, x: array[0..maxN] of longint;

function max( a, b: longint ): longint;
  begin
    if (a > b) then begin
      max := a
    end else begin
      max := b
    end
  end;

function min( a, b: longint ): longint;
  begin
    if (a < b) then begin
      min := a
    end else begin
      min := b
    end
  end;

function getMove( i, j: longint ): longint;
  begin
    getMove := max(a + f[i - j], b + f[(j + 1) div 2]);
  end;

var
  i, j, cur, ans: longint;

begin
  assign(input, 'apricot.in');
  assign(output, 'apricot.out');
  reset(input);
  rewrite(output);

  readln(n, a, b);
  f[0] := -inf; f[1] := 0;
  x[0] := 1; x[1] := 1;
  for i := 2 to n do begin
    x[i] := -1;
    f[i] := inf;
    j := x[i - 1];
    cur := getMove(i, j);
    while ((j < i) and (cur >= getMove(i, j + 1))) do begin
      cur := getMove(i, j + 1);
      inc(j);
    end;
    f[i] := cur;
    x[i] := j;
  end;
  ans := inf;
  for i := 1 to n do begin
    ans := min(ans, getMove(n, i));
  end;
  writeln(ans);
end.
