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