#include <bits/stdc++.h> using namespace std; double p[65536],br[65536],bi[65536],z,zz,h; double cr[65536],ci[65536]; double sr[65536],si[65536],sss[65536]; double ss[65536]; double wr[17][65536],wi[17][65536]; vector <double> hh; vector <int> ans; bool r; long long rou; const double PI = 3.14159265358979323846; double wmr,wmi,tr,ti,ur,ui,zzm,zp; char x; int n,k,d,t,i,a,j,b; int m,m2,y,s,L,P,c,tt; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> t; s=0; for(i=0;i<n;i++) { cin >> z; //z=0.501; hh.push_back(-z); } make_heap(hh.begin(),hh.end()); sort_heap(hh.begin(),hh.end()); i=0; r=1; while(i*i<n) i++; a=0; for(j=0;j<17;j++) { a=1<<j; for(m=0;m<a;m++){ wr[j][m]=cos((PI*m)/a); wi[j][m]=-sin((PI*m)/a); } } a=0; i=1000; while(a<n) { for(j=0;j<65536;j++) p[j]=0.; p[0]=1.; s=1; for (k=0;k<i && a<n;k++) { z=-hh[a]; zp=1.-z; a++; for(j=s;j>0;j--){ p[j]*=zp; p[j]+=p[j-1]*z; } p[0]*=1.-z; zz=0; tt=(t+a+1)/2; if(r) for(j=s;2*j>=t+s;j--) zz+=p[j]; else {for(j=0;j<=s &&tt>=j;j++) zz+=p[j]*sss[tt-j]; } if(zz>zzm) zzm=zz; s++; } //cout << a << '\n'; for(j=0;j<65536;j++){ b=0; c=j; for(m=0;m<16;m++) { b<<=1; b|=(c&1); c>>=1; } br[b]=p[j]; bi[b]=0.; } for(j=1;j<=16;j++) { m=1<<j; m2=m>>1; for(k=0;k<m2;k++) { for(d=k;d<65536;d+=m) { tr=br[d+m2]*wr[j-1][k]-bi[d+m2]*wi[j-1][k]; ti=br[d+m2]*wi[j-1][k]+bi[d+m2]*wr[j-1][k]; br[d+m2]=br[d]-tr; bi[d+m2]=bi[d]-ti; br[d]+=tr; bi[d]+=ti; } } } if(r){r=0; for(k=0;k<65536;k++) { cr[k]=br[k]; ci[k]=bi[k]; } } else{ for(k=0;k<65536;k++) { tr=cr[k]*br[k]-ci[k]*bi[k]; ti=cr[k]*bi[k]+ci[k]*br[k]; cr[k]=tr; ci[k]=ti; } } for(j=0;j<65536;j++){ b=0; c=j; for(m=0;m<16;m++) { b<<=1; b|=(c&1); c>>=1; } br[b]=cr[j]; bi[b]=ci[j]; } for(j=1;j<=16;j++) { m=1<<j; m2=m>>1; for(k=0;k<m2;k++) { for(d=k;d<65536;d+=m) { tr=br[d+m2]*wr[j-1][k]+bi[d+m2]*wi[j-1][k]; ti=-br[d+m2]*wi[j-1][k]+bi[d+m2]*wr[j-1][k]; br[d+m2]=br[d]-tr; bi[d+m2]=bi[d]-ti; br[d]+=tr; bi[d]+=ti; } } } z=0.; for(j=65535;j>=0;j--){ br[j]/=65536.; bi[j]/=65536.; z+=br[j]; sss[j]=z;} } rou=llroundl(zzm*10000000.); if(rou>= 10000000) cout << "1.0000000" << '\n'; else { cout << 0 << '.'; for(i=0;i<7;i++) { ans.push_back(rou%10); rou/=10; } for(i=6;i>=0;i--) cout << ans[i]; cout << '\n';} }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | #include <bits/stdc++.h> using namespace std; double p[65536],br[65536],bi[65536],z,zz,h; double cr[65536],ci[65536]; double sr[65536],si[65536],sss[65536]; double ss[65536]; double wr[17][65536],wi[17][65536]; vector <double> hh; vector <int> ans; bool r; long long rou; const double PI = 3.14159265358979323846; double wmr,wmi,tr,ti,ur,ui,zzm,zp; char x; int n,k,d,t,i,a,j,b; int m,m2,y,s,L,P,c,tt; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> t; s=0; for(i=0;i<n;i++) { cin >> z; //z=0.501; hh.push_back(-z); } make_heap(hh.begin(),hh.end()); sort_heap(hh.begin(),hh.end()); i=0; r=1; while(i*i<n) i++; a=0; for(j=0;j<17;j++) { a=1<<j; for(m=0;m<a;m++){ wr[j][m]=cos((PI*m)/a); wi[j][m]=-sin((PI*m)/a); } } a=0; i=1000; while(a<n) { for(j=0;j<65536;j++) p[j]=0.; p[0]=1.; s=1; for (k=0;k<i && a<n;k++) { z=-hh[a]; zp=1.-z; a++; for(j=s;j>0;j--){ p[j]*=zp; p[j]+=p[j-1]*z; } p[0]*=1.-z; zz=0; tt=(t+a+1)/2; if(r) for(j=s;2*j>=t+s;j--) zz+=p[j]; else {for(j=0;j<=s &&tt>=j;j++) zz+=p[j]*sss[tt-j]; } if(zz>zzm) zzm=zz; s++; } //cout << a << '\n'; for(j=0;j<65536;j++){ b=0; c=j; for(m=0;m<16;m++) { b<<=1; b|=(c&1); c>>=1; } br[b]=p[j]; bi[b]=0.; } for(j=1;j<=16;j++) { m=1<<j; m2=m>>1; for(k=0;k<m2;k++) { for(d=k;d<65536;d+=m) { tr=br[d+m2]*wr[j-1][k]-bi[d+m2]*wi[j-1][k]; ti=br[d+m2]*wi[j-1][k]+bi[d+m2]*wr[j-1][k]; br[d+m2]=br[d]-tr; bi[d+m2]=bi[d]-ti; br[d]+=tr; bi[d]+=ti; } } } if(r){r=0; for(k=0;k<65536;k++) { cr[k]=br[k]; ci[k]=bi[k]; } } else{ for(k=0;k<65536;k++) { tr=cr[k]*br[k]-ci[k]*bi[k]; ti=cr[k]*bi[k]+ci[k]*br[k]; cr[k]=tr; ci[k]=ti; } } for(j=0;j<65536;j++){ b=0; c=j; for(m=0;m<16;m++) { b<<=1; b|=(c&1); c>>=1; } br[b]=cr[j]; bi[b]=ci[j]; } for(j=1;j<=16;j++) { m=1<<j; m2=m>>1; for(k=0;k<m2;k++) { for(d=k;d<65536;d+=m) { tr=br[d+m2]*wr[j-1][k]+bi[d+m2]*wi[j-1][k]; ti=-br[d+m2]*wi[j-1][k]+bi[d+m2]*wr[j-1][k]; br[d+m2]=br[d]-tr; bi[d+m2]=bi[d]-ti; br[d]+=tr; bi[d]+=ti; } } } z=0.; for(j=65535;j>=0;j--){ br[j]/=65536.; bi[j]/=65536.; z+=br[j]; sss[j]=z;} } rou=llroundl(zzm*10000000.); if(rou>= 10000000) cout << "1.0000000" << '\n'; else { cout << 0 << '.'; for(i=0;i<7;i++) { ans.push_back(rou%10); rou/=10; } for(i=6;i>=0;i--) cout << ans[i]; cout << '\n';} } |