QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#422357#990. Colorful ComponentsBronyaRE 0ms0kbC++202.0kb2024-05-27 12:31:372024-05-27 12:31:38

Judging History

你现在查看的是最新测评结果

  • [2024-05-27 12:31:38]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-05-27 12:31:37]
  • 提交

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;
}

详细

Test #1:

score: 0
Dangerous Syscalls

input:

5 3
1
1
3
1
5

output:


result: