比赛 寒假集训2 评测结果 WWWWWWEEEEEEEEEEEEEE
题目名称 组合数问题 最终得分 0
用户昵称 彭欣越 运行时间 3.071 s
代码语言 C++ 内存使用 6.71 MiB
提交时间 2026-02-25 12:05:51
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
ll n,x,m,p,ans,a[N],f[N],c[1010][1010];
ll qpow (ll x,ll y) {
    ll sum=1;
    while (y) {
        if (y&1) {
            sum*=x;
            sum%=p;
        }
        x*=x;
        x%=p;
        y>>=1;
    }
    return sum;
}
ll C (ll x,ll y) {
    return qpow(f[y],p-2)%p*qpow(f[x-y],p-2)%p*f[x]%p;
}
int main () {
    freopen("problem.in","r",stdin);
    freopen("problem.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> n >> x >> p >> m;
    for (int i=0;i<=m;i++) cin >> a[i];
    f[1]=1;
    for (int i=2;i<=n;i++) f[i]=f[i-1]*i%p;
    for (int i=1;i<=1000;i++) {
        c[i][1]=i;
        c[i][0]=1;
        c[i][i]=1;
    }
    for (int i=2;i<=1000;i++) {
        for (int j=i+1;j<=1000;j++) {
            c[j][i]=(c[j-1][i]+c[j-1][i-1])%p;
        }
    }
    if (n<=1000) {
        for (int i=0;i<=n;i++) {
            ll sum=0;
            for (int j=0;j<=m;j++) {
                sum+=a[j]*qpow(i,j)%p;
                sum%p;
            }
            //cout << sum <<endl;
            sum=sum*qpow(x,i)%p*c[n][i]%p;
            ans+=sum;
        }
        cout << ans <<"\n";
    }else{
        for (int i=0;i<=n;i++) {
            ll sum=a[0];
            sum=sum*qpow(x,i)%p*C(n,i)%p;
            ans+=sum;
        }
        cout << ans <<"\n";
    }
    return 0;
}