题解 | #Beautiful Numbers#

Beautiful Numbers

https://ac.nowcoder.com/acm/problem/229274

题意

一个数字称为good数要满足两个条件

  • 它只有组成
  • 它的位数之和也只有组成

位数的数字一共有多少个good数

思路

我们假设有,那么可以知道和为,这个和最多也才

那么我们可以枚举和,然后算出,然后接着这可以任意插在位里面,也就是

代码

/**
 *    author: andif
 *    created: 24.08.2023 22:45:45
**/
#include<bits/stdc++.h>
using namespace std;

#define de(x) cerr << #x << " = " << x << endl
#define dd(x) cerr << #x << " = " << x << " "
#define rep(i, a, b) for(int i = a; i < b; ++i)
#define per(i, a, b) for(int i = a; i > b; --i)
#define mt(a, b) memset(a, b, sizeof(a))
#define sz(a) (int)a.size()
#define fi first
#define se second
#define qc ios_base::sync_with_stdio(0);cin.tie(0)
#define eb emplace_back
#define all(a) a.begin(), a.end()
using ll = long long;
using db = double;
using pii = pair<int, int>;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const db eps = 1e-9;
const int mod = 1e9 + 7;
const int N = 1e6 + 6;

int qpow(int a, int b) {
    int ret = 1;
    while(b) {
        if (b & 1) {
            ret = 1ll * ret * a % mod;
        }
        a = 1ll * a * a % mod;
        b >>= 1;
    }
    return ret;
}

int main() {
    qc;
    int a, b, n; cin >> a >> b >> n;
    if (n == 1) return cout << "2" << '\n', 0;
    int ans = 0;
    vi f(N);
    f[0] = 1;
    rep(i, 1, N) f[i] = 1ll * i * f[i - 1] % mod;
    vi inv(N);
    inv[N - 1] = qpow(f[N - 1], mod - 2);
    per(i, N - 2, 0) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;

    // per(i, N - 1, 0) {
    //     if (1ll * inv[i] * f[i] % mod != 1) {
    //         de(i);
    //         break;
    //     }
    // }
    auto check = [&] (int x) {
        while(x) {
            int y = x % 10;
            if (y != a && y != b) return false;
            x /= 10;
        }
        return true;
    };
    rep(i, 0, 9 * n + 1) {
        if (!check(i)) continue;
        int y = i - b * n;
        if (y % (a - b) != 0) continue;
        int x = y / (a - b);
        if (x < 0 || n - x < 0) continue;
        if (!x || !(n - x)) {
            ans = (ans + 1) % mod;
        } else {
            // dd(x), dd(n - x), dd(f[n]), dd(inv[n - x]), de(inv[x]);
            ans = (ans + 1ll * f[n] * inv[n - x] % mod * inv[x] % mod) % mod;
        }
    }
    cout << ans << '\n';
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务