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