爲什麽我 wa 掉了#6
查看原帖
爲什麽我 wa 掉了#6
339966
Kusanagi_Nene楼主2025/1/22 23:37
#include <iostream>

using namespace std;

const int maxn = 605;

#define int long long

const int mod = 999911659;

int n, p, r;
int cnt[maxn], pos[maxn][maxn];
int dp[maxn][maxn][10];
int inv[maxn], c[maxn][maxn];

int pw(int a, int b)
{
    int res = 1;
    while (b) {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
signed main()
{
    cin >> n >> p;
    int sum = 0, lst = 1;
    r = p;
    for (int i = 1; i <= p; i++) {
        sum = (10 * sum % p + 1) % p;
        lst = i;
        cnt[sum % p]++;
        pos[sum % p][++pos[sum % p][0]] = i;
        if (sum % p == 0)
            break;
    }
    for (int i = 0; i < p; i++) {
        cnt[i] *= (n / lst);
        for (int j = 1; j <= pos[i][0]; j++) {
            if (pos[i][j] <= n % lst) {
                cnt[i]++;
                if (pos[i][j] == n % lst)
                    r = i;
            } else
                break;
        }
        cnt[i] %= mod;
    }
    // cout << r << "\n";
    // for (int i = 0; i < p; i++)
    // cout << cnt[i] << "\n";
    for (int i = 0; i <= 8; i++)
        inv[i] = pw(i, mod - 2);
    for (int i = 0; i < p; i++)
        for (int j = 0; j <= 8; j++) {
            // c[i][j] = C_{cnt[i] + j - 1}^{j}
            c[i][j] = 1;
            for (int k = 1, s = cnt[i] + j - 1; k <= j; k++, s--)
                c[i][j] = s % mod * c[i][j] % mod * inv[k] % mod;
        }
    // for (int i = 0; i < p; i++)
    // for (int j = 0; j <= 8; j++)
    // cout << "C(" << cnt[i] + j - 1 << ", " << j << "):" << c[i][j] << "\n";
    for (int i = 0; i <= 8; i++)
        dp[0][0][i] = c[0][i];
    for (int i = 0; i < p; i++)
        for (int j = 0; j <= 8; j++)
            for (int k = 0; k <= 8 - j; k++)
                for (int pre = 0; pre < p; pre++)
                    (dp[i + 1][(pre + k * (i + 1) % p) % p][j + k] += (dp[i][pre][j] * c[i + 1][k] % mod)) %= mod;
    int ans = 0;
    for (int i = 0; i <= 8; i++)
        (ans += dp[p - 1][p - r][i]) %= mod;
    cout << ans << "\n";
    return 0;
}

你好。我是一个发帖狂人。

2025/1/22 23:37
加载中...