Problem:
監獄

無限人の囚人たちがいる。はじめ、囚人たちは 0, 1, 2, ... と番号が振られている。

次の操作を N 回行う。

0 番目の囚人を釈放し、k, 2k, 3k, ... 番目の囚人たちを処刑する。

その後、残った囚人たちに番号を振り直す。このとき、元の番号が小さい囚人から順に 0, 1, 2, ... と番号を振る。

N 回目の操作で釈放される囚人がはじめに振られていた番号を求めよ。

Constraints

1 ≤ N ≤ 10^5

2 ≤ k ≤ 10^5

答えは 10^{18} 以下である。

Input Format

入力は以下の形式で標準入力から与えられる。

N k

Output Format

答えを一行に出力せよ。

Sample Input 1

4 2

Sample Output 1

7

Sample Input 2

1 3

Sample Output 2

0

Sample Input 3

100000 100000

Sample Output 3

99999

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
#define rep(i, a, n) for(int i = a; i < n; i++)
#define int long long
using namespace std;
typedef pair<int, int> P;
const int INF = 1e9;

int n, k;

int f(int s){
    if(s % k == 0) s++;
    return s - s / k - 1;
}

signed main(){
    cin >> n >> k;
    int t = 0;
    rep(i, 0, n - 1){
        int l = 0, r = 2e18;
        while(r - l > 1){
            int mid = (l + r) / 2;
            // cout << mid << ' ' << f(mid) << ' ' << t << endl;
            if(f(mid) > t){
                r = mid;
            }else{
                l = mid;
            }
        }
        // cout << " " << l << " " << r << endl;
        t = l;
    }
    cout << t << endl;
}