ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF104E New Year Garland

2019-02-08 19:37:57  阅读:337  来源: 互联网

标签:种颜色 1000005 Garland int CF104E long mul New 个球


粘个题解。。。

100% 先考虑小问题:恰用 j 种颜色布置一行 i 个球的方案数 dp[i][j]。
用类似于最小表示法的思想,我们要求 x 号颜色的首次出现位置必须比 x+1
号颜色的早,这样一来将所求得的方案数乘以颜色的全排列数 j!就是原来的
方案数。若前 i-1 个球使用了 j-1 种颜色,则第 i 个球必然使用了第 j 种颜色;
若前 i-1 个球已使用了 j 种颜色,则第 i 个球使用的颜色必须与第 i-1 个球不
同,所以 有(j-1)种方案。故可由简单的 dp 递推而得:
F[i][j] = F[i-1][j-1] + F[i-1][j] * (j-1)
现在考虑相邻两层之间的限制,用 d[i][j]表示前 i 层中第 i 层恰用了 j 种颜色
的方案数。因为使用的颜色数不可能多于球数,又总球数不超过10^7,故d[i][j]
的状态总数也不超过 10^7。
若不考虑两层之间的颜色集合需不同这一条件,则转移方程为
d[i][j] = (m!/(m-j)!) * F[l[i]][j] * Σd[i-1][k]
再减去不符合这一条件的部分即可:
d[i][j] = (m!/(m-j)!) * F[l[i]][j] * Σd[i-1][k] – d[i-1][j] * F[l[i]][j] * j!
其中(m!/(m-j)!)与 j!都可以预处理得到
时间复杂度:O(Σl[i] + l[i]^2)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,p,cnt,tot,mx;
 6 long long sum,tmp,ml;
 7 int l[1000005];
 8 long long mul[1000005];
 9 long long f[5005][5005];
10 long long pr[1000005];
11 long long dp[1000005];
12 void pre_work(){
13     mul[m+1]=1ll;
14     for(int i=m;i>=1;i--)
15         mul[i]=mul[i+1]*1ll*i%p;
16 }
17 int main(){
18     scanf("%d%d%d",&n,&m,&p);
19     pre_work();
20     for(int i=1;i<=n;i++){
21         scanf("%d",&l[i]);
22         mx=max(l[i],mx);
23     }f[0][0]=1;
24     for(int i=1;i<=mx;i++)
25         for(int j=1;j<=min(i,m);j++)
26             f[i][j]=(f[i-1][j-1]+f[i-1][j]*1ll*(j-1))%p;
27     tmp=1;
28     for(int i=1;i<=n;i++){
29         sum=tmp;tmp=0;ml=1;
30         for(int j=1;j<=l[i];j++){
31             ml*=1ll*j;ml%=p;
32             dp[j]=((sum*mul[m-j+1]%p*f[l[i]][j]%p-pr[j]*f[l[i]][j]%p*ml%p)%p+p)%p;
33             (tmp+=dp[j])%=p;
34         }
35         for(int j=1;j<=l[i-1];j++)pr[j]=0;
36         for(int j=1;j<=l[i];j++)pr[j]=dp[j];
37     }printf("%I64d\n",tmp);
38     return 0;
39 }

 

标签:种颜色,1000005,Garland,int,CF104E,long,mul,New,个球
来源: https://www.cnblogs.com/lnxcj/p/10356583.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有