记录编号 |
551759 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[统一省选 2020]组合数问题 |
最终得分 |
100 |
用户昵称 |
斯内普和骑士 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.644 s |
提交时间 |
2020-06-24 18:04:52 |
内存使用 |
23.07 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define R register
typedef long long ll;
const int maxn=1110;
ll n,x,p,m,g_h_y;
ll fac[maxn],a[maxn],trans[maxn][maxn];
inline ll qpow(ll g,ll k,ll mod)
{
ll res=1;
while(k)
{
if(k&1)
res=(res*g)%mod;
if(k>>=1)
g=g*g%mod;
}
return res;
}
inline void init(ll mod)
{
fac[0]=1;
for(R ll i=1;i<=1100;i++)
fac[i]=fac[i-1]*i%mod;
trans[1][1]=1;
for (int i=2;i<=m;i++)
{
for (int j=1;j<=i;j++) {
trans[i][j]=((trans[i-1][j]*j)%p+trans[i-1][j-1])%p;
}
}
}
inline ll S(ll g,ll k)
{
return trans[g][k];
}
int main()
{
freopen("haoi2020_problem.in","r",stdin);
freopen("haoi2020_problem.out","w",stdout);
scanf("%lld%lld%lld%lld",&n,&x,&p,&m);
for(R ll i=0;i<=m;i++)
{
scanf("%lld",&a[i]);
}
init(p);
g_h_y=(a[0]*qpow((x+1)%p,n,p))%p;
for(R ll i=1;i<=m;i++)
{
ll tot=(qpow(x%p,i,p)*qpow((x+1)%p,n-i,p)%p)%p;
ll val=0;
for(R ll j=0;j<=i-1;j++)
{
tot=(tot*(n-j))%p;
}
for(R ll j=i;j<=m;j++)
{
val=(val+(S(j,i)*a[j])%p)%p;
}
g_h_y=(g_h_y+(val*tot)%p)%p;
}
printf("%lld\n",g_h_y);
return 0;
}