import java.util.Scanner;
public class Main{
public static double getMean(int n,int m,int[] c,double[][] p) { //n,m,c,p 与题干给出的一一对应
double ans=0; //记录期望值
double[] prizeLeft; //记录剩余礼物数
for(int j=0;j<m;j++) {
if (c[j]<1) { //如果这种礼品只有0件
prizeLeft=new double[0];
}else {
prizeLeft=new double[c[j]+1]; //初始化
prizeLeft[c[j]]=1;
for(int i=0;i<n;i++) {
prizeLeft[0]+=prizeLeft[1]*p[i][j]; //礼品被选择完,这句不加对结果也不影响
for(int k=0;k<c[j];k++) {
prizeLeft[k]=prizeLeft[k]*(1-p[i][j])+prizeLeft[k+1]*p[i][j]; //上一份礼品j被选走但这一份礼品没被选择的情况
}
prizeLeft[c[j]]=prizeLeft[c[j]]*(1-p[i][j]); //第i个人没有选择礼品j的情况
}
}
for(int k=1;k<=c[j];k++) {
ans+=prizeLeft[k]*k; //没有选到礼品j的期望人数;
}
}
ans=n-ans;
return ans;
}
public static void main(String[] args){ //初始化
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
sc.nextLine();
String[] strc=sc.nextLine().split(" ");
int[] c=new int[m];
double[][] p=new double[n][m];
for(int i=0;i<m;i++){
c[i]=Integer.parseInt(strc[i]);
}
for(int i=0;i<n;i++){
String[] strn=sc.nextLine().split(" ");
for(int j=0;j<m;j++){
p[i][j]=Double.parseDouble(strn[j]);
}
}
double mean=getMean(n,m,c,p);
System.out.print(String.format("%.1f", mean));
}
}