#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';} } |
English