QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#422357 | #990. Colorful Components | Bronya | RE | 0ms | 0kb | C++20 | 2.0kb | 2024-05-27 12:31:37 | 2024-05-27 12:31:38 |
answer
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[305];
int cnt[305];
int f[305][305];
const int mo=1000000007;
const int N=600;
int fact[N+5],ifact[N+5];
int fast_pow(int a,int p){
int sum=1;
while(p){
if(p&1)sum=1ll*sum*a%mo;
a=1ll*a*a%mo;
p>>=1;
}
return sum;
}
int add(int u,int v){
return (u+v>=mo?u+v-mo:u+v);
}
int C(int u,int v){
if(u<v)return 0;
return 1ll*fact[u]*ifact[v]%mo*1ll*ifact[u-v]%mo;
}
void Init(){
fact[0]=1;
for(int i=1;i<=N;i++)fact[i]=1ll*fact[i-1]*i%mo;
ifact[N]=fast_pow(fact[N],mo-2);
for(int i=N-1;i>=0;i--)ifact[i]=ifact[i+1]*1ll*(i+1)%mo;
}
int g[305][305],sav[305];
int dp[2][305];
int pw[305];
int main(){
scanf("%d%d",&n,&k);Init();
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cnt[a[i]]++;
}
int N=0;
for(int i=1;i<=n;i++)N=max(N,cnt[i]);
f[0][0]=1;
pw[1]=1;
for(int i=2;i<=N;i++)
pw[i]=fast_pow(i,i-2);
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++)
for(int l=1;l<=min(j,k);l++)
f[i][j]=add(f[i][j],f[i-1][j-l]*1ll*C(j-1,l-1)%mo*1ll*l%mo*1ll*pw[l]%mo);
}
for(int j=1;j<=N;j++){
int pre=fast_pow(j,mo-2);
for(int i=1;i<=N;i++){
if(i&1)sav[j]=add(sav[j],1ll*f[i][j]*pre%mo);
else sav[j]=add(sav[j],mo-1ll*f[i][j]*pre%mo);
pre=1ll*pre*j%mo;
}
}
dp[0][0]=1;
int sum=0;
for(int i=1;i<=n;i++){
if(!cnt[i])continue;
for(int j=1;j<=cnt[i];j++)
for(int k=1;k<=cnt[i];k++)
g[j][k]=0;
g[0][0]=1;
for(int j=1;j<=cnt[i];j++){
for(int s=1;s<=cnt[i];s++)
for(int l=1;l<=s;l++)
g[j][s]=add(g[j][s],g[j-1][s-l]*1ll*C(s-1,l-1)%mo*1ll*sav[l]%mo*1ll*l%mo);
}
for(int j=1;j<=cnt[i];j++){
for(int s=0;s<=sum;s++)
dp[1][j+s]=add(dp[1][j+s],g[j][cnt[i]]*1ll*dp[0][s]%mo);
}
sum+=cnt[i];
for(int s=0;s<=sum;s++)dp[0][s]=dp[1][s],dp[1][s]=0;
}
int pre=fast_pow(n,mo-2),ans=0;
for(int i=1;i<=sum;i++){
ans=add(ans,1ll*pre*dp[0][i]%mo);
pre=1ll*pre*n%mo;
}
printf("%d\n",ans);system("pause");
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Dangerous Syscalls
input:
5 3 1 1 3 1 5