可以看到如果n非常大的时候会一直减2018。

所以我们可以先用二进制枚举快速减很多个2018,把n降到一个比较小的数字,然后再带进函数暴力计算。

#include <bits/stdc++.h>

using namespace std;

long long f(long long n) {
    if (n < 20180001) return n + 2017;
    return f(f(n - 2018));
}

int main() {
    long long n;
    cin >> n;

    long long t = 2018LL << 30;
    long long p = 20180001 + 2018 * 3;
    while (t >= 2018) {
        while (n - t > p)
            n -= t;
        cerr << n << " " << t << endl;
        t /= 2;
    }
    cerr << n << "\n";
    cout << f(n) << endl;
    return 0;
}