#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#define eps 1e-8
#define maxn 333
using namespace std;
int n,m,x,y,d;
int cnt;
double p[maxn];
int vis[maxn];
double A[maxn][maxn];
int sgn(double num)
{
if(fabs(num)<eps) return 0;
else return num>0?1:-1;
}
void init()
{
n=(n-1)*2;
memset(A,0,sizeof(A));
if(d==1) x=n-x;
}
int find_next(int a,int b)
{
return (a%b+b)%b;
}
bool bfs()
{
memset(vis,-1,sizeof(vis));
cnt=0;
queue<int> q;
q.push(x);
vis[x]=cnt++;
while(!q.empty())
{
int tmp=q.front();
q.pop();
for(int i=1;i<=m;i++)
{
if(sgn(p[i])==0) continue;
int next=find_next(tmp+i,n);
if(vis[next]==-1)
{
vis[next]=cnt++;
q.push(next);
}
}
}
if(vis[y]==-1&&vis[n-y]==-1)
return false;
else
return true;
}
void build()
{
for(int i=0;i<n;i++)
{
A[vis[i]][vis[i]]=1;
if(i==y||i==(n-y))
{
A[vis[i]][cnt]=0;
continue;
}
for(int j=1;j<=m;j++)
{
int next=find_next(i+j,n);
A[vis[i]][vis[next]]-=p[j];
A[vis[i]][cnt]+=j*p[j];
}
}
}
bool gaosi()
{
int i,j,r,c;
for(r=0,c=0;r<cnt&&c<cnt;++c,++r)
{
//找不为0的行
for(i=r;i<cnt;i++)
{
if(sgn(A[i][c])!=0)
break;
}
if(i==cnt)
{
r--;continue;
}
//替换
if(i!=r)
{
for(j=r;j<=cnt;j++) swap(A[i][j],A[r][j]);
}
//消元
for(i=r+1;i<cnt;i++)
{
double f=A[i][c]/A[r][c];
for(j=c;j<=cnt;j++)
{
A[i][j]-=A[r][j]*f;
}
}
}
//判断是否有解
for(i=r;i<cnt;i++)
{
if(sgn(A[i][cnt])) return -1;//无解
}
if(r<cnt) return cnt-r;//有无穷解
//回代
for(i=cnt-1;i>=0;i--)
{
for(j=cnt-1;j>i;j--)
{
A[i][cnt]-=A[i][j]*A[j][cnt];
}
A[i][cnt]/=A[i][i];
A[i][i]=1;
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d",&n,&m,&y,&x,&d);
for(int i=1; i<=m; i++)
{
scanf("%lf",&p[i]);
p[i]/=100;
}
if(x==y)
{
printf("0.00\n");
continue;
}
init();
if(!bfs())
{
printf("Impossible !\n");
continue;
}
build();
if(gaosi()==0)
{
printf("%.2lf\n",A[vis[x]][cnt]);
}
else
{
printf("Impossible !\n");
}
}
return 0;
}
hdu 4418
最新推荐文章于 2018-08-25 10:57:58 发布