import java.util.*; class Main { public static void main(String[] args) { new Main().run(); } final long MOD=(long)1e9+7; long[] fac=new long[100000]; long[] ifac=new long[100000]; long[] inv=new long[100000]; { fac[0]=fac[1]=ifac[0]=ifac[1]=inv[0]=inv[1]=1; for (int i=2;i0) continue; if (dq>S[i]) continue; int np=p+dp; int nq=q+dq; if (np>Mp||nq>Mq) continue; f[i+1][np][nq]=(f[i+1][np][nq]+f[i][p][q])%MOD; } } } } } long ans=0; for (int i=0;i<=Mq;++i) ans=(ans+f[N][Mp][i])%MOD; return ans; } void rnd() { Random rnd=new Random(10); while(true) { int N=20; int L=20; int Mp=1+rnd.nextInt(L); int Mq=rnd.nextInt(L); int[] S=new int[N]; for (int i=0;i=0;--n) { for (int q=0;q<=Mq;++q) { if (q+1<=Mq) dp[n+1][q+1]=(dp[n+1][q+1]+dp[n][q])%MOD; if (q+S[i]+1<=Mq) dp[n+1][q+S[i]+1]=(dp[n+1][q+S[i]+1]+MOD-dp[n][q])%MOD; } for (int q=0;q<=Mq;++q) dp[n+1][q]%=MOD; } } for (int n=0;n<=N;++n) { for (int t=0;tMp) continue; ans=(ans+comb(N-1+Mp-(n*L-q),N-1)*dp[n][q]%MOD)%MOD; } } return ans; } void tr(Object...objects) {System.out.println(Arrays.deepToString(objects));} }