#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 1000000000000 const long long MOD = 1000000007; using namespace std; typedef long long llong; #define debug cout << "Hello" << endl; //int isalpha(char ch): ch がアルファベットなら true を返す //int isdigit(char ch): ch が数字なら true を返す //int islower(char ch): ch が小文字なら true を返す //int isupper(char ch): ch が大文字なら true を返す //int tolower(char ch): ch の小文字を返す //int toupper(char ch): ch の大文字を返す //string型 //size() 文字数を返す //Insert() (指定した場所に)文字・文字列を挿入する //erase() (指定した場所の)文字・文字列を削除する //clear() すべての文字を削除する //substr() 文字列の(指定した)部分文字列を返す //replace() (指定した)部分文字列を新しい文字列に置換する //c_str()変換 //文字列の比較は、<=や==などを使え //replace関数を使い、簡単に文字列を置換 //リバース関数:reverse(str.begin(), str.end()); //map dict;で宣言 //グラフ理論用変数 //vector > graph(N); //ソート //降順sort(v.begin(), v.end(), std::greater()); //大文字から小文字へんかん //w[i] = w[i]-'A'+'a'; //vector //assignメソッド 引数:サイズ、値 //与えられたサイズと値でvectorを初期化する //queueクラス //find()次に取り出す値の表示をする。 //pop()値を取り出す。戻り値はなし //push()キューに値をプッシュする //priority_queueクラス //切り上げ //ceil //floor int main(){ llong N,K; cin >> N >> K; vector A(N+1, 0); llong total=0; for(int i=1; i<=N; i++){ cin >> A[i]; total = total + A[i]; } vector > > dp(N+1, vector >(N+1, vector(total+1, 0))); dp[0][0][0] = 1; for(int i=1; i<=N; i++){ for(int j=0; j<=N; j++){ for(int k=0; k<=total; k++){ if(j-1<0){ dp[i][j][k] = dp[i-1][j][k]%MOD; continue; } if(k-A[i]<0){ dp[i][j][k] = dp[i-1][j][k]%MOD; continue; } dp[i][j][k] = (dp[i-1][j][k]%MOD+dp[i-1][j-1][k-A[i]]%MOD)%MOD; } } } llong ans=0; for(int i=1; i<=N; i++){ for(int j=0; j<=total; j++){ if(K<=((double)j/(double)i)){ ans = (ans%MOD + dp[N][i][j]%MOD)%MOD; } } } cout << ans << endl; return 0; }