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));

    }
}