#include<stdio.h> #include<algorithm> #include<queue> using namespace std; int p[20][20]; int q[20][20]; double dp[13][1<<11]; int st[20]; double pr[1<<11]; int v[20]; int si[1<<22]; int mask[1<<11]; double EPS=1e-14; int main(){ int a,b;scanf("%d%d",&a,&b); for(int i=0;i<a;i++)for(int j=0;j<b;j++)scanf("%d",&p[i][j]); for(int i=0;i<a;i++)for(int j=0;j<b;j++)scanf("%d",&q[i][j]); for(int i=0;i<(1<<b);i++){ for(int j=0;j<b;j++){ if(!(i&(1<<j))){ mask[i]+=(1<<(j*2))+(1<<(j*2+1)); } } //printf("%d: %d\n",i,mask[i]); } for(int i=0;i<(1<<(b*2));i++){ for(int j=0;j<b;j++){ st[j]=3-(i>>(j*2))%4; } for(int j=0;j<b-1;j++){ if(st[j]>=3)st[j+1]++; } for(int j=b-1;j>0;j--){ if(st[j]>=3)st[j-1]++; } int to=0; for(int j=0;j<b;j++)if(st[j]>=3)to+=(1<<j); si[i]=to; } dp[0][0]=1; for(int i=0;i<a;i++){ for(int j=0;j<(1<<b);j++){ double th=1; for(int k=0;k<b;k++){ if(j&(1<<k)){ th=th*p[i][k]/100; }else{ th=th*(100-p[i][k])/100; } } pr[j]=th; } for(int k=0;k<(1<<b);k++){ if(dp[i][k]<EPS)continue; int req=0; for(int l=b-1;l>=0;l--){ req*=4; int tt=q[i][l]; if(q[i][l]&&(k&(1<<l)))tt--; if(tt==4)tt--; req+=tt; } for(int l=0;l<(1<<b);l++){ if(pr[l]<EPS)continue; dp[i+1][si[req|mask[l]]]+=pr[l]*dp[i][k]; } } } double ret=0; for(int i=1;i<=a;i++){ for(int j=0;j<(1<<b);j++){ // if(dp[i][j]>EPS)printf("%d %d: %f\n",i,j,dp[i][j]); ret+=dp[i][j]*(__builtin_popcount(j)); } } printf("%.12f\n",ret); }