func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   using min_pq = priority_queue<T, vector<T>, greater<T>>;   template <typename T>   using max_pq = priority_queue<T>;   const int inf = 2e9 + 5;   const long long l_inf = 2e18 + 5;   const int mod_v = 1e9 + 7;   const int max_n = 1e5 + 5;   const int dx[4] = {-1, 0, 1, 0};   const int dy[4] = {0, 1, 0, -1};   template <typename T>   T gcd(T a, T b) {     while (b) {       T temp = a % b;       a = b;       b = temp;     }     return a;   }   template <typename T>   tuple<T, T, T> egcd(T a, T b) {     T x1 = 1, x2 = 0, y1 = 0, y2 = 1;     while (b) {       T q = a / b, r = a % b;       T new_x = x1 - q * x2, new_y = y1 - q * y2;       x1 = x2, y1 = y2, x2 = new_x, y2 = new_y;       a = b, b = r;     }     return make_tuple(a, x1, y1);   }   inline long long lcm(long long a, long long b) { return a * b / gcd(a, b); }   template <typename T>   inline T mod(T a, T b = mod_v) {     return (a % b + b) % b;   }   template <typename T>   inline T mod_inv(T a, T b = mod_v) {     return mod(get<1>(egcd(a, b)), b);   }   template <typename T>   inline T sum(T a, T b, T m = mod_v) {     return mod(mod(a, m) + mod(b, m), m);   }   template <typename T>   inline T difference(T a, T b, T m = mod_v) {     return mod(mod(a, m) - mod(b, m), m);   }   inline long long product(long long a, long long b, long long m = mod_v) {     return mod(mod(a, m) * mod(b, m), m);   }   inline long long quotient(long long a, long long b, long long m = mod_v) {     return mod(mod(a, m) * mod_inv(b, m), m);   }   template <typename T, typename T2>   ostream &operator<<(ostream &s, const pair<T, T2> &p) {     return s << p.first <<     << p.second <<    ;   }   template <typename T, typename T2>   istream &operator>>(istream &s, pair<T, T2> &p) {     return s >> p.first >> p.second;   }   template <typename T>   ostream &operator<<(ostream &s, const vector<T> &v) {     for (auto it : v) s << it <<    ;     return s;   }   template <typename T>   istream &operator>>(istream &s, vector<T> &v) {     for (auto it = (v).begin(), it_ = (v).end(); it != it_; ++it) s >> *it;     return s;   }   template <typename T>   void read_range(T beg, T end) {     while (beg != end) cin >> *beg++;   }   template <typename T>   void print_range(T beg, T end) {     while (beg != end) cout << *beg++ <<    ;   }   struct reader {     template <typename T>     reader &operator,(T &v) {       cin >> v;       return *this;     }   } rdr;   struct debugger {     template <typename T>     debugger &operator,(const T &v) {       cerr << v <<  ,  ;       return *this;     }   } dbg;   map<pair<int, int>, long long> memo;   long long ar[max_n * 10], cnt[max_n * 10], cnt2[10 * max_n], comp[10 * max_n];   vector<pair<int, int>> v;   long long f(int cur, int k) {     if (k == 0) return 1;     if (cur == -1) return 0;     if (memo.find(make_pair(cur, k)) != memo.end())       return memo[make_pair(cur, k)];     return memo[make_pair(cur, k)] =                (f(cur - 1, k) + (cnt[cur] * f(cur, k - 1)) % mod_v) % mod_v;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     long long n, l, k;     rdr, n, l, k;     ;     read_range(ar, ar + n);     for (int i = 0; i < n; ++i) v.emplace_back(ar[i], i);     sort((v).begin(), (v).end());     int sz = 0;     for (int i = 0; i < n; ++i) {       while (i + 1 < n and v[i].first == v[i + 1].first) {         comp[v[i].second] = sz;         ++cnt[sz];         ++i;       }       comp[v[i].second] = sz;       ++cnt[sz];       ++sz;     }     long long rem = l % n, seg = l / n;     for (int i = 0; i < rem; ++i) ++cnt2[comp[i]];     long long ans = 0;     for (int i = 1; i <= min(k, seg); ++i) {       ans += ((seg - i + 1) % mod_v) * f(sz - 1, i);       ans %= mod_v;     }     for (int i = 1; i <= min(k, seg + 1); ++i) {       for (int j = 0; j < sz; ++j) {         ans += cnt2[j] * f(j, i - 1);         ans %= mod_v;       }     }     cout << ans;     return 0;   }   