exlucas板子求调
查看原帖
exlucas板子求调
651793
Rosent楼主2024/8/15 19:20
#include <bits/stdc++.h>
#define int long long
#define maxn 1010

#ifndef ONLINE_JUDGE
#define getchar_unlocked() getchar()
#endif

using namespace std;

int read() {
    int x=0,flag=1;char c=getchar_unlocked();
    while(c<'0'||c>'9') {if(c=='-')flag=-1;c=getchar_unlocked();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar_unlocked();}
    return x*flag;
}

int n, m, mod;
int pnum[maxn], pri[maxn], ans[maxn];
int top = 0;

int exgcd(int a, int b, int &x, int &y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    int h = exgcd(b, a%b, y, x);
    y -= a / b * x;
    return h;
}

void excrt(int &a, int &mod, int aa, int mmod) {
    int g = __gcd(mod, mmod);
    int m = mod / g * mmod;
    int p, q;
    exgcd(mod / g, mmod / g, p, q);
    p = p * mod % m * (aa - a) / g % m;
    a = (a + p + m) % m;
    mod = m;
}

int qpow(int a, int b, int m) {
    int ans = 1, tmp = a;
    while (b != 0) {
        if(b & 1) {
            ans = (ans % m * tmp % m) % m;
        }
        tmp = tmp * tmp % m;
        b >>= 1;
    }
    return ans;
}
int qpow(int a, int b) {
    int ans = 1, tmp = a;
    while (b != 0) {
        if(b & 1) {
            ans = (ans * tmp);
        }
        tmp = tmp * tmp;
        b >>= 1;
    }
    return ans;
}

int f(int n, int mod, int k) {//k 底数 n当前分解 mod 完整的模数(p^k)
    if (n == 0) {
        return 1;
    }
    int ans = 1;
    for (int i = 1; i <= mod; i++) {
        if (i % k != 0) {
            ans = ans * i  % mod;
        }
    } 
    // cerr << ans <<" " << n  << " " << mod << " " << k << endl;
    ans = qpow(ans, n / mod, mod);
    for (int i = mod * (n / mod); i <= n; i++) {
        if (i % k != 0) {
            ans = ans * (i % mod) % mod;
        }
    }
    ans = (ans * f(n / k, mod, k)) % mod;
    return ans; 
}

int g(int n, int k) {
    if (n < k) {
        return 0;
    }
    return g(n / k, k) + n / k;
}

int inv(int k, int mod) {
    int x, y;
    exgcd(k, mod, x, y);
    return (x + mod) % mod;
}

int solve(int k, int mod) {
    return f(n, mod, k) * inv(f(m, mod, k), mod) % mod * inv(f(n-m, mod, k), mod) % mod * qpow(k, g(n, k) - g(m, k) - g(n - m, k), mod) % mod;
}

signed main() {
    n = read(); m = read(); mod = read();
    int upp = sqrt(mod);
    for (int i = 2; i <= upp; i++) {
        if (mod % i == 0) {
            ++top;
            pri[top] = i;
            while (mod > 0 && mod % i == 0) {
                pnum[top] ++;
                mod /= i;
            }
        }
    }
    if (mod != 0) {
        pri[++ top] = mod;
        pnum[top] ++;
    }
    for (int i = 1; i <= top; i++) {
        ans[i] = solve(pri[i], qpow(pri[i], pnum[i]));
    }
    int res = ans[1], resmod = qpow(pri[1], pnum[1]);
    for (int i = 2; i <= top; i++) {
        excrt(res, resmod, ans[i], qpow(pri[i], pnum[i]));
    }
    cout << res << endl;
    return 0;
}

似乎是 f 函数炸掉了。

2024/8/15 19:20
加载中...