import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	}

}
 import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io import java.util.StringTokenizer; StringTokenizer java.util public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	}

} Main public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	} main {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	} BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); br new BufferedReader(new InputStreamReader(System.in)) StringTokenizer st=new StringTokenizer(br.readLine()); st new StringTokenizer(br.readLine()) int an=Integer.parseInt(st.nextToken()); an Integer.parseInt(st.nextToken()) Integer.parseInt Integer st.nextToken() st.nextToken st int m=Integer.parseInt(st.nextToken()); m Integer.parseInt(st.nextToken()) Integer.parseInt Integer st.nextToken() st.nextToken st int[][] Aary=new int[an][m]; Aary new int[an][m] an m for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		} int y=0; int y=0; y 0 y<an y an y++ y++ y {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		} {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		} for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			} int x=0; int x=0; x 0 x<m x m x++ x++ x {
				Aary[y][x]=0;
			} {
				Aary[y][x]=0;
			} Aary[y][x]=0 Aary[y][x] Aary[y] Aary y x 0 int[] Bary=new int[m]; Bary new int[m] m for(int x=0;x<m;x++) {
			Bary[x]=0;
		} int x=0; int x=0; x 0 x<m x m x++ x++ x {
			Bary[x]=0;
		} {
			Bary[x]=0;
		} Bary[x]=0 Bary[x] Bary x 0 for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		} int y=0; int y=0; y 0 y<an y an y++ y++ y {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		} {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		} StringTokenizer sa=new StringTokenizer(br.readLine()); sa new StringTokenizer(br.readLine()) for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			} int x=0; int x=0; x 0 x<m x m x++ x++ x {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			} {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			} int a=Integer.parseInt(sa.nextToken()); a Integer.parseInt(sa.nextToken()) Integer.parseInt Integer sa.nextToken() sa.nextToken sa Aary[y][x]=a Aary[y][x] Aary[y] Aary y x a for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		} int x=0; int x=0; x 0 x<m x m x++ x++ x {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		} {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		} StringTokenizer sb=new StringTokenizer(br.readLine()); sb new StringTokenizer(br.readLine()) int b=Integer.parseInt(sb.nextToken()); b Integer.parseInt(sb.nextToken()) Integer.parseInt Integer sb.nextToken() sb.nextToken sb Bary[x]=b Bary[x] Bary x b int c=0; c 0 for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		} int y=0; int y=0; y 0 y<an y an y++ y++ y {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		} {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		} for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			} int x=0; int x=0; x 0 x<m x m x++ x++ x {
				c=c+Aary[y][x]*Bary[x];
			} {
				c=c+Aary[y][x]*Bary[x];
			} c=c+Aary[y][x]*Bary[x] c c+Aary[y][x]*Bary[x] c Aary[y][x]*Bary[x] Aary[y][x] Aary[y] Aary y x Bary[x] Bary x System.out.println(c) System.out.println System.out System System.out c c=0 c 0 String[] args args public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	}

} public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	}

} Main
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		int an=Integer.parseInt(st.nextToken());
		int m=Integer.parseInt(st.nextToken());

		//配列作成
		//行列A
		int[][] Aary=new int[an][m];
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				Aary[y][x]=0;
			}
		}
		//ベクトルb
		int[] Bary=new int[m];
		for(int x=0;x<m;x++) {
			Bary[x]=0;
		}

		//配列の数値入力
		//A
		for(int y=0;y<an;y++) {
			StringTokenizer sa=new StringTokenizer(br.readLine());
			for(int x=0;x<m;x++) {
				int a=Integer.parseInt(sa.nextToken());
				Aary[y][x]=a;
			}
		}
		//b
		for(int x=0;x<m;x++) {
			StringTokenizer sb=new StringTokenizer(br.readLine());
			int b=Integer.parseInt(sb.nextToken());
			Bary[x]=b;
		}

		//配列の加工
		int c=0;
		for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				c=c+Aary[y][x]*Bary[x];
			}
			System.out.println(c);
			c=0;
		}

		//配列出力・デバッグ
		/*for(int y=0;y<an;y++) {
			for(int x=0;x<m;x++) {
				System.out.print(Aary[y][x]);
			}
			System.out.println("");
		}*/
	}

}

