Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52737 | LinkZelda | 敏捷排列 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 1516 | 2022-07-20 11:51:29 |
#include<iostream> #include<cstdio> #include<algorithm> #include<ctype.h> #define int long long #define eps 1e-8 using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int bin[25],sz[25]; int dp[21][21],n,a[25],aa,bb,fac; int ans; int anc(int x) { return bin[x]==x?x:bin[x]=anc(bin[x]); } double anss,sum; double cal(int x,double awa) { double ret=1.0; awa/=fac; for(int i=1; i<=x; i++) ret*=1.0-awa; return ret; } signed main() { n=read(); aa=read(),bb=read(); fac=1; for(int i=1; i<=n; i++) bin[i]=i,sz[i]=1,fac*=i; for(int i=1; i<=n; i++) { a[i]=read(); int x=anc(a[i]),y=anc(i); if(x==y) continue; bin[x]=y; sz[y]+=sz[x]; } for(int i=1; i<=n; i++) if(bin[i]==i) ans+=sz[i]-1; if(aa*ans<bb) return printf("%lld\n",ans*aa),0; dp[0][0]=1; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) dp[i][j]=(dp[i-1][j-1]+dp[i-1][j]*(i-1)); for(int i=1; i*bb<=ans*aa; i++) { for(int j=1; j<=n; j++) { int ovo=0; for(int k=j+1; k<=n; k++) ovo+=dp[n][k]; if(fabs(ovo)<eps) continue; double qwq=cal(i-1,ovo)*dp[n][j]/ovo; sum+=qwq; anss+=qwq*((n-j)*aa+bb*i); } } printf("%.9lf",anss+aa*sum); return 0; }