[8月16日绍兴]试剂

题目描述

输入

第一行两个正整数n,m

接下来一行n个正整数描述ai

输出

一个正整数,表示答案

样例输入

3 1000000007 1 2 3

样例输出

75

提示

 发现同样大小的连乘块系数相同。对其DP

#include<bits/stdc++.h>
#define LL long long
#define N 3007
LL f[N][N],Dp[N],n,mo,x,ans;
using namespace std;
signed main () {
    scanf("%lld%lld",&n,&mo);
    f[1][0]=1;
    for (int i=1;i<=n;i++)
     for (int j=0;j< n;j++)  {
         if (i==1&&j==0) continue;
         if (j) f[i][j]=(f[i][j]+f[i][j-1]*i%mo*j)%mo;
         if (j>1) f[i][j]=(f[i][j]+f[i][j-1]*j%mo*(j-1))%mo;
         if (i>1) f[i][j]=(f[i][j]+f[i-1][j]*(i*(i-1)/2))%mo;
     } 
    Dp[0]=1;
    for (int i=1;i<=n;i++) {
        scanf("%lld",&x);
        for (int j=i;j;j--) Dp[j]=(Dp[j]+Dp[j-1]*x)%mo;
    }
    for (int i=1;i<=n;i++)
     ans=ans+Dp[i]*f[i][n-i]%mo;
    return printf("%lld\n",ans%mo),0;
}

猜你喜欢

转载自www.cnblogs.com/rrsb/p/9489606.html