1 条题解

  • 0
    @ 2025-10-8 17:09:12
    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <iomanip>
    #include <cstdio>
    #include <cmath>
    #include <map>
    #define LL long long int
    #define REP(i, n) for (int i = 1; i <= (n); i++)
    #define Redge(u) for (int k = h[u], to; k; k = ed[k].nxt)
    #define cls(s, v) memset(s, v, sizeof(s))
    #define mp(a, b) make_pair<int, int>(a, b)
    #define cp pair<int, int>
    using namespace std;
    const int maxn = 2000005, maxm = 100005, INF = 0x3f3f3f3f;
    LL pr[2], pk[2], fac[2], P, k1, k2, now;
    
    inline LL qpow(LL a, LL b, LL p) {
        LL re = 1;
        for (; b; b >>= 1, a = 1ll * a * a % p)
            if (b & 1) re = 1ll * re * a % p;
        return re;
    }
    
    inline void exgcd(LL a, LL b, LL& d, LL& x, LL& y) {
        if (!b) { d = a; x = 1; y = 0; }
        else exgcd(b, a % b, d, y, x), y -= (a / b) * x;
    }
    
    inline LL inv(LL n, LL p) {
        LL d, x, y; exgcd(n, p, d, x, y);
        return (x % p + p) % p;
    }
    
    inline LL Fac(LL n, LL P, LL p) {
        if (!n) return 1;
        LL ans = 1;
        if (n / P) ans = qpow(fac[now], n / P, P);
        LL E = n % P;
        for (LL i = 2; i <= E; i++)
            if (i % p) ans = 1ll * ans * i % P;
        return 1ll * ans * Fac(n / p, P, p) % P;
    }
    
    inline int C(LL n, LL m, int pk, int p) {
        now = (p == 5);
        LL a = Fac(n, pk, p), b = Fac(m, pk, p), c = Fac(n - m, pk, p), ans;
        ans = 1ll * a * inv(b, pk) % pk * inv(c, pk) % pk;
        if (p == 2) {
            if (k1 >= k2)
                ans = 1ll * ans * qpow(inv(5, pk), k2, pk) % pk * qpow(2, k1 - k2, pk) % pk;
            else ans = 1ll * ans * qpow(inv(5, pk), k1, pk) % pk;
        } else {
            if (k1 >= k2)
                ans = 1ll * ans * qpow(inv(2, pk), k2, pk) % pk;
            else ans = 1ll * ans * qpow(inv(2, pk), k1, pk) % pk * qpow(5, k2 - k1, pk) % pk;
        }
        return 1ll * ans * (P / pk) % P * inv(P / pk, pk) % P;
    }
    
    inline LL exlucas(LL n, LL m) {
        for (LL i = n; i; i /= 2) k1 += i / 2;
        for (LL i = m; i; i /= 2) k1 -= i / 2;
        for (LL i = n - m; i; i /= 2) k1 -= i / 2;
        for (LL i = n; i; i /= 5) k2 += i / 5;
        for (LL i = m; i; i /= 5) k2 -= i / 5;
        for (LL i = n - m; i; i /= 5) k2 -= i / 5;
        LL re = 0;
        re = (re + C(n, m, pk[0], pr[0])) % P;
        re = (re + C(n, m, pk[1], pr[1])) % P;
        return re;
    }
    
    int main() {
        LL N, M, K;
        cin >> N >> M >> K;
        pr[0] = 2; pr[1] = 5; pk[0] = pk[1] = P = 1;
        REP(i, K) pk[0] *= 2, pk[1] *= 5, P *= 10;
        fac[0] = 1; for (LL i = 2; i < pk[0]; i++) if (i % 2) fac[0] = 1ll * fac[0] * i % pk[0];
        fac[1] = 1; for (LL i = 2; i < pk[1]; i++) if (i % 5) fac[1] = 1ll * fac[1] * i % pk[1];
        cout << setfill('0') << setw(K) << exlucas(N + M, N) << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    5403
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者