本来只会压位。。。看了黄学长的题解恍然大悟。。。同样数量的颜色本质上是相同的啊。。。
然后就从5^15变成15^5就可以做了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mod 1000000007 using namespace std; long long k,cnt[6],c[20],dp[6][16][16][16][16][16]; long long dfs(long long x,long long a,long long b,long long c,long long d,long long e) { if (dp[x][a][b][c][d][e]) return dp[x][a][b][c][d][e]; long long ret=0; if (a) ret=(ret+(a-(x==2))*dfs(1,a-1,b,c,d,e)%mod)%mod; if (b) ret=(ret+(b-(x==3))*dfs(2,a+1,b-1,c,d,e)%mod)%mod; if (c) ret=(ret+(c-(x==4))*dfs(3,a,b+1,c-1,d,e)%mod)%mod; if (d) ret=(ret+(d-(x==5))*dfs(4,a,b,c+1,d-1,e)%mod)%mod; if (e) ret=(ret+e*dfs(5,a,b,c,d+1,e-1)%mod)%mod; dp[x][a][b][c][d][e]=ret; return ret; } int main() { scanf("%lld",&k); for (long long i=1;i<=k;i++) { scanf("%lld",&c[i]); cnt[c[i]]++; } for (int i=1;i<=5;i++) dp[i][0][0][0][0][0]=1; printf("%lld\n",dfs(0,cnt[1],cnt[2],cnt[3],cnt[4],cnt[5])); return 0; }