20分求调
查看原帖
20分求调
1011552
BlindErmine5883楼主2024/4/29 07:13

中心思想是用快速幂求逆元,来求出组合数 WA第20,46两点

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 2100010;

int n, m, p;
int f[N], in_f[N];
int sum;

LL qmi(int a, int k, int p)
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        k >>= 1;
        a = (LL)a * a % p;
    }
    return res;
}

LL get(int a, int b)
{
    return (LL)f[a] * in_f[b] % p * in_f[a - b] % p; 
}


signed main()
{
    cin >> n >> m >> p;
    
    if (m == 1) // 特判
    {
        cout << n % p;
        return 0;
    }
    
    
    f[0] = in_f[0] = 1;
    for (int i = 1; i <= n + m; i ++ )
    {
        f[i] = (LL)f[i - 1] * i % p;
        in_f[i] = qmi(f[i], p - 2, p)  % p;
        if (i <= m) sum = (sum + f[i]) % p;
    }
    
    int ans = 0;
    for (int i = 0; i <= n; i ++ )
    {
        ans = (LL)(ans + (LL)i * get(n - i + m - 2, m - 2) % p) % p;
    }
    
    cout << (LL)ans * sum % p << endl;
    // cout << get(3, 0);
    return 0;
}
2024/4/29 07:13
加载中...