func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 4;   int n, k, b[N], vis[N];   long long l, dp[N], temp[N];   const long long mod = 1e9 + 7;   struct node {     friend bool operator<(node x, node y) {       if (x.a == y.a) return x.pos < y.pos;       return x.a < y.a;     }     int a, pos;   };   node po[N];   int main() {     cin >> n >> l >> k;     for (int i = 0; i < n; i++) {       scanf( %d , &po[i].a);       po[i].pos = i;     }     sort(po, po + n);     po[n].a = po[n - 1].a + 10;     for (int i = n - 1; i >= 0; i--) {       if (po[i].a == po[i + 1].a)         vis[i] = vis[i + 1];       else         vis[i] = i;       b[po[i].pos] = i;     }     for (int i = 0; i < n; i++) {       dp[i] = 1;     }     long long ans = l, sum, fn = (long long)n;     ans %= mod;     for (int i = 2; i <= k; i++) {       temp[0] = dp[0];       for (int j = 1; j < n; j++) {         temp[j] = temp[j - 1] + dp[j];         temp[j] %= mod;       }       sum = 0;       for (int j = 0; j < n; j++) {         dp[j] = temp[vis[j]];         sum += dp[j];         sum %= mod;       }       if (l % fn == 0) {         if (i <= l / fn) {           ans += ((l / fn - i + 1) % mod) * sum;           ans %= mod;         }       } else {         if (i <= l / fn) {           ans += ((l / fn - i + 1) % mod) * sum;           ans %= mod;           sum = 0;           for (int j = 0; j < l % fn; j++) {             sum += dp[b[j]];             sum %= mod;           }           ans += sum;           ans %= mod;         } else if (i == l / fn + 1) {           sum = 0;           for (int j = 0; j < l % fn; j++) {             sum += dp[b[j]];             sum %= mod;           }           ans += sum;           ans %= mod;         }       }     }     cout << ans % mod <<   n ;     return 0;   }   