#include <iostream> using namespace std; int v[21]; // place int w[21]; // weight #define BASE 6000 int c[21][BASE+6000]; int main() { int C, G; scanf("%d%d", &C, &G); for(int i = 1; i <= C; ++i) scanf("%d", &v[i]); for(int i = 1; i <= G; ++i) scanf("%d", &w[i]); for(int i = 1; i <= C; ++i) c[1][BASE+w[1]*v[i]] = 1; for(int i = 2; i <= G; ++i) for(int j = -BASE; j <= BASE; ++j) { int sum = 0; for(int k = 1; k <= C; ++k) if(BASE+j-w[i]*v[k]>=0) sum += c[i-1][BASE+j-w[i]*v[k]]; c[i][BASE+j] = sum; } printf("%d/n", c[G][BASE]); return 0; } //0-1背包问题: // 状态转移方程:c[i][j] = sum{c[i-1][j-w[k]*v[i]], (k:1->n)}; // 即前i个物品力矩为j时的最大可能数,那么所求即为:c[n][0]