Wa+Tle5分求助
查看原帖
Wa+Tle5分求助
359614
Forever1507楼主2022/8/13 10:53

rt,过了样例,中国剩余定理没学,自己用小奥口胡了一个过了板子所以看上去非常非主流()

// Problem: P2480 [SDOI2010]古代猪文
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2480#submit
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Author: Forever1507

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, g, mod = 999911659;
// 2*3*4679*35617
int fac[10000005], a[1000] = {0, 2, 3, 4679, 35617}, b[1000];
vector<int> p;
void zh() {
    for (int i = 1; i <= n; ++i) {
        if (n % i == 0) p.push_back(i);
    }
    return;
}
int qpow(long long a, int b, int p) {
    int ans = 1;
    a = (a % p + p) % p;
    for (; b; b >>= 1) {
        if (b & 1) ans = (a * ans) % p;
        a = (a * a) % p;
    }
    return ans;
}
void work() {
    fac[0] = 1;
    for (int i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i % mod;
}
int inv(int x, int p) { return qpow(x, p - 2, p); }
int C(int n, int m, int p) {
    if (n > m) return 0;
    return fac[m] * inv(fac[n], p) % p * inv(fac[m - n], p) % p;
}
int lucas(int k, int m, int p) {
    if (m == 0) return 1;
    return C(k % p, m % p, p) * lucas(k / p, m / p, p) % p;
}
int lcm(int a, int b) { return a / __gcd(a, b) * b; }
signed main() {
    cin >> n >> g;
    zh();
    work();
    int ans = 0;
    for (int i = 0; i < p.size(); ++i) {
        //	cout<<p[i]<<'\n';
        ans = (ans + lucas(p[i], n, mod)) % mod;
    }
    //	cout<<ans<<'\n';
    int maxn = 0, mb = 0;
    for (int i = 1; i <= 4; ++i) {
        b[i] = ans % a[i];
        if (a[i] > maxn) maxn = a[i], mb = b[i];
    }
    int cnt = mb, _ = maxn;
    while (1) {
        bool flag = 0;
        for (int i = 1; i <= 4; ++i)
            if (cnt % a[i] != b[i])
                flag = 1;
            else
                _ = lcm(_, a[i]);
        if (!flag) {
            cout << qpow(g, cnt, mod);
            return 0;
        }
        cnt += _;
    }
    return 0;
}
2022/8/13 10:53
加载中...