#include void input(std::string f) { std::string one = f + ".in"; std::string two = f + ".out"; freopen(one.c_str(), "r", stdin); freopen(two.c_str(), "w", stdout); } const long long N = 11; const long long mod = 1e9 + 7; const long long NOK = 2520; long long n, k, sp, cnt_sp; long long a[N]; std::pair dp[NOK+7][NOK+7], dp2[NOK+7][N], dp3[NOK+7][N]; long long fact[2*NOK+7], inv_fact[2*NOK+7]; long long curr[N]; long long modf(long long x) { while(x >= mod) x -= mod; return x; } long long fast_pow(long long base, long long exp) { if(exp == 0) return 1ll; long long res = 1; if(exp & 1) res = base; long long tmp = fast_pow(base, exp >> 1ll); res *= tmp; res %= mod; res *= tmp; res %= mod; return res; } long long permutation(long long n, long long k) { long long res = fact[n+k]*inv_fact[n]; res %= mod; //std::cout << res << " " << n << " n k "<< k << std::endl; res *= inv_fact[k]; res %= mod; //std::cout << res << " " << n << " n k "<< k << std::endl; //std::cin.get(); return res; } void init() { fact[0] = 1ll; inv_fact[0] = 1ll; for(long long i = 1; i <= 2*NOK; i++) { fact[i] = i * fact[i-1]; fact[i] %= mod; inv_fact[i] = fast_pow(fact[i], mod - 2); } } long long solve(long long i, long long j) { //std::cout << i << " - " << j << std::endl; if(j > i) return 0; if(dp[i][j].second) return dp[i][j].first; if(j == 0) return 0; dp[i][j].second = true; for(long long ind = 1; ind <= n; ind++) if(a[ind] != sp && i >= a[ind]) { dp[i][j].first += solve(i-a[ind],j-1); dp[i][j].first = modf(dp[i][j].first); } //std::cout << dp[i][j].first << " " << i << " " << j << std::endl; return dp[i][j].first; } long long solve2(long long i, long long j) { if(i * cnt_sp >= j) return 0; if(dp2[j][i].second) return dp2[j][i].first; dp2[j][i].second = true; for(long long ind = 1ll; ind <= NOK; ind++) { dp2[j][i].first += (solve(j - i*sp, ind) * permutation(ind-1ll, i)) % mod; dp2[j][i].first = modf(dp2[j][i].first); } return dp2[j][i].first; } long long solve3(long long i, long long j) { //std::cout << i << " jj " << j << std::endl; if(i * cnt_sp >= j) return 0; if(dp3[j][i].second) return dp3[j][i].first; dp3[j][i].second = true; for(long long ind = 1ll; ind <= NOK; ind++) { dp3[j][i].first += (solve(j - i*sp, ind) * permutation(ind, i)) % mod; dp3[j][i].first = modf(dp3[j][i].first); } //std::cout << dp3[i][j].first << " " << i << " " << j << std::endl; return dp3[j][i].first; } int main () { std::ios::sync_with_stdio(false); std::cin.tie(NULL); input("protein"); init(); std::cin >> k >> n; k /= 10; for(long long i = 1; i <= n; i++) { std::cin >> a[i]; a[i] /= 10; } std::cin >> sp >> cnt_sp; sp /= 10; dp[0][0] = {1, true}; curr[0] = 1ll; while(k > NOK) { k -= NOK; for(long long i = cnt_sp; i >= 0; i--) { long long new_curr = 0; for(long long j = i; j >= 0; j--) { new_curr += (curr[j] * solve2(i-j, NOK)) % mod; new_curr = modf(new_curr); } curr[i] = new_curr; } } //for(int i = 0; i <= cnt_sp; i++) // std::cout << dp3[k][i] << " / " << i << "\n"; for(long long i = cnt_sp; i >= 0; i--) { long long new_curr = 0; for(long long j = i; j >= 0; j--) { new_curr += (curr[j] * solve3(i-j, k)) % mod; new_curr = modf(new_curr); } curr[i] = new_curr; } long long res = 0; for(long long i = 0; i <= cnt_sp; i++) { //std::cout << curr[i] << " = " << i << "\n"; res += curr[i]; res = modf(res); } std::cout << res << "\n"; return 0; }