[NOI赛前训练]——专项测试3·数学
由于并不想写T1和T2的题解……所有只有T3的题解了。
T3
由于内部题就只写题解了。
好吧,我是一点都不想写……
说一下这zz题解哪里写错了吧……
……不想写……
就说一个吧……
$n-\frac{k-i}{2}$应该是$\frac{k-i}{2}$。
好累啊,完全不想写题解,有空再说吧。
1 #include "bits/stdc++.h" 2 3 using namespace std; 4 5 const int N=4e2+10; 6 7 double f[N][N],p[N][N],C[N][N],mi[N][N]; 8 9 int n,num[N][N]; 10 char s[N]; 11 12 inline void init(){ 13 int i,j,k; 14 for (C[0][0]=i=1;i<N;++i) 15 for (C[i][0]=j=1;j<=i;++j) 16 C[i][j]=C[i-1][j]+C[i-1][j-1]; 17 for (i=1;i<=n;++i) 18 for (j=i,k=0;j<=n;++j){ 19 if (s[j]=='.') ++k; 20 num[i][j]=k; 21 } 22 } 23 24 inline void dp(){ 25 if (!num[1][n]){ 26 puts("0.000000");return ; 27 } 28 register int i,j,k,l; 29 for (i=1;i<=n;++i) if(s[i]=='.') 30 p[i][i]=1.0; 31 for (l=2;l<=(n>>1);++l) { 32 for (i=1;i<=l;++i) 33 for (mi[i][0]=1,k=1;k<=l;++k) 34 mi[i][k]=mi[i][k-1]*i/l; 35 for (i=1,j=l;i<=n;++i,++j) { 36 f[i][j]=p[i][j]=0.0; 37 if(s[j]=='.'){ 38 for (k=i;k<j;++k) if(s[k]=='.'){ 39 int lk=num[i][k-1],rk=num[k+1][j-1]; 40 double now=C[lk+rk][lk]* 41 mi[(k-i+1)][lk+1]* 42 mi[(j-k)][rk]* 43 p[i][k]*p[k+1][j]; 44 p[i][j]+=now; 45 f[i][j]+=now*(f[i][k]+f[k+1][j]+(k-i)/2.0); 46 } 47 if (num[i][j-1]==0)p[i][j]=1.0; 48 f[i][j]/=p[i][j]; 49 } 50 } 51 } 52 double ans=0.0; 53 for (i=1;i<=n/2;++i) 54 ans+=f[i][i+n/2-1]*p[i][i+n/2-1]; 55 ans+=(n/2-1)/2.0; 56 printf("%.6f\n",ans); 57 } 58 59 int main(){ 60 int T; 61 scanf("%d",&T); 62 while (T--) { 63 scanf("%s",s+1); 64 n=strlen(s+1); 65 for (int i=n+1;i<=(n<<1);++i) 66 s[i]=s[i-n]; 67 n<<=1; 68 init(); 69 dp(); 70 } 71 }
没有什么不可能。