AGC020F Arcs on a Circle 题解
Coffee_zzz · · 题解
将所有线段从短到长排序,考虑断环为链,以第
虽然每条线段的左端点都是在实数范围内随机的,但我们其实只关心小数部分的相对大小关系,且可以认为小数部分两两不同,因此我们可以考虑直接枚举
考虑 dp:设
直接计算即可。时间复杂度
const int N=7,C=51;
int n,c,V,a[N],p[N],rk[N];
ll ans,dp[N*C][N*C][1<<N],cnt;
void solve(){
cin>>n>>c,V=1<<(n-1);
for(int i=1;i<=n;i++) cin>>a[i],p[i]=i;
sort(a+1,a+n+1);
while(1){
memset(dp,0,sizeof dp);
dp[0][a[n]*n][0]=1,cnt++;
for(int i=1;i<n;i++) rk[p[i]]=i;
for(int i=0;i<n*c;i++){
for(int j=i;j<=n*c;j++){
for(int s=0;s<V;s++){
int k=rk[i%n];
dp[i+1][j][s]+=dp[i][j][s];
if(k!=0&&(!(s&(1<<(k-1))))) dp[i+1][min(max(j,i+a[k]*n),c*n)][s|(1<<(k-1))]+=dp[i][j][s];
}
}
}
ans+=dp[n*c][n*c][V-1];
if(!next_permutation(p+1,p+n)) break;
}
printf("%.18lf",ans*1.0/cnt/pow(c,n-1));
}