#include #include #include using namespace std; typedef long long llong; const llong MOD = 1000000007LL; llong k; int n,m; int protein[11]; int limited; int matrix[211][211]; llong F[1011][11]; int col = 0; llong solve(int sum,int used) { if (F[sum][used] != -1) return F[sum][used]; llong ans = 0; int i; for (i=1;i<=n;i++) { if (protein[i] != limited) { if (sum >= protein[i]) ans += solve(sum - protein[i], used); } else if (used != 0) { if (sum >= protein[i]) ans += solve(sum - protein[i], used - 1); } } ans %= MOD; F[sum][used] = ans; return ans; } llong help[211][211]; llong ans[211][211]; void matrixPower(llong p) { int i,j,in; if (p == 1) { for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { ans[i][j] = matrix[i][j]; } } return; } matrixPower(p/2LL); for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { help[i][j] = 0; for (in=1;in<=col;in++) { help[i][j] += ans[i][in] * ans[in][j]; if (help[i][j] >= MOD) help[i][j] %= MOD; } } } if (p%2LL == 1LL) { for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { ans[i][j] = 0; for (in=1;in<=col;in++) { ans[i][j] += help[i][in] * matrix[in][j]; if (ans[i][j] >= MOD) ans[i][j] %= MOD; } } } } else { for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { ans[i][j] = help[i][j]; } } } return; } llong initialvec[1011]; llong vec[1011]; int main() { freopen("protein.in","r",stdin); freopen("protein.out","w",stdout); memset(F,-1,sizeof(F)); int i,j; scanf("%lld",&k); k /= 10LL; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&protein[i]); protein[i] /= 10; } scanf("%d %d",&limited,&m); limited /= 10; const int LIM = 9; F[0][0] = 1; for (i=0;i<=LIM;i++) { for (j=0;j<=m;j++) { solve(i,j); } } for (i=0;i<=m;i++) { for (j=0;j<=8;j++) { col++; initialvec[col] = solve(j, i); matrix[col+1][col] = 1; } col++; initialvec[col] = solve(9, i); for (j=1;j<=n;j++) { if (protein[j] != limited) { matrix[col - protein[j] + 1][col] = 1; } else if (i != 0) { matrix[col - 10 - protein[j] + 1][col] = 1; } } } if (k <= LIM) { int minans = 0; for (i=0;i<=m;i++) { minans += solve(k, i); } printf("%d\n",minans); return 0; } matrixPower(k - 10LL + 1); /* for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { printf("%d ",ans[i][j]); } printf("\n"); } printf("Initial:\n"); for (i=1;i<=col;i++) { printf("%lld ",initialvec[i]); if (i%10 == 0) printf("|"); } printf("\n"); */ for (i=1;i<=col;i++) { for (j=1;j<=col;j++) { vec[i] += initialvec[j] * ans[j][i]; if (vec[i] >= MOD) vec[i] %= MOD; } } /* printf("Final:\n"); for (i=1;i<=col;i++) { printf("%lld ",vec[i]); if (i%10 == 0) printf("|"); } printf("\n"); */ llong bigans = 0; for (i=0;i<=m;i++) { bigans += vec[10 * (i+1)]; } bigans %= MOD; printf("%lld\n",bigans); return 0; }