func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long nmax = (long long)1e6 + 10;   inline long long up(char ch) { return  z  - ch; }   inline long long lo(char ch) { return ch -  a ; }   inline long long eq(char ch) { return 1; }   long long dp[2002][2002];   long long tmp[2002];   signed main() {     ios_base ::sync_with_stdio(false);     cin.tie(0);     long long n, k;     cin >> n >> k;     string s;     cin >> s;     memset(dp, 0, sizeof dp);     dp[n][0] = 1;     for (long long i = n - 1; i >= 0; i--) {       for (long long j = 0; j <= k; j++) {         if (j - (n - i) >= 0)           dp[i][j] = (up(s[i]) * dp[i + 1][j - (n - i)]) % 1000000007;         dp[i][j] += (lo(s[i]) * dp[i + 1][j]) % 1000000007;         dp[i][j] %= 1000000007;         long long last = i;         for (long long t = i + 1; t < n; t++) {           if (j - (n - t) * (t - i + 1) >= 0) {             dp[i][j] +=                 (up(s[t]) * dp[t + 1][j - (n - t) * (t - i + 1)]) % 1000000007;             dp[i][j] %= 1000000007;             last = t;           } else {             break;           }         }         for (long long t = n - 1; t > last; t--) {           if (j - (n - t) * (t - i + 1) >= 0) {             dp[i][j] +=                 (up(s[t]) * dp[t + 1][j - (n - t) * (t - i + 1)]) % 1000000007;             dp[i][j] %= 1000000007;           } else {             break;           }         }         dp[i][j] += tmp[j];         dp[i][j] %= 1000000007;         if (j == 0) {           dp[i][j]++;           dp[i][j] %= 1000000007;         }         tmp[j] = tmp[j] + (lo(s[i]) * dp[i + 1][j]) % 1000000007;         tmp[j] %= 1000000007;       }     }     cout << dp[0][k] << endl;     return 0;   }   