P12397 「FAOI-R9」函数大师 题解

· · 题解

场切了。

Statement

我们定义:

给定 kt 次询问,每次给定 m,求 y=f_k(x)y=m 的图象的公共点个数。

数据范围:1 \le t \le 10^50 \le k \le 10^91 \le m \le 10^{18}

Analysis

根据 Subtask 提示,分几种情况考虑:

复杂度是常数级的。

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f;
int t, k;
int s(int x){
    int ret = 0;
    while (x > 0){
        ret += x % 10;
        x /= 10;
    }
    return ret;
}
void solve(){
    int m;
    cin >> m;
    int cnt = 0;
    if (k == 0){ //不要忘记 k=0 的情况
        cout << 1 << endl;
        return;
    }
    for (int a = 0;a <= 200;a++){
        int b = s(a), c = s(b), d = s(c);
        if (k == 1){
            int x = m - a;
            cnt += (s(x) == a);
        }
        else if (k == 2){
            int x = m - a - b;
            cnt += (s(x) == a && s(s(x)) == b);
        }
        else{
            int x = m - a - b - c * (k - 2);
            cnt += (s(x) == a && s(s(x)) == b && s(s(s(x))) == c);
        }
    }
    cout << cnt << endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> t >> k;
    while (t--) solve();
    return 0;
}