Pagini recente » Cod sursa (job #692686) | Cod sursa (job #2845987) | Cod sursa (job #447834) | Cod sursa (job #3195226) | Cod sursa (job #2971117)
#include <iostream>
#include <vector>
#define MAXN 2000
#define MOD 1000000007
using namespace std;
long long dp[MAXN][MAXN + 1];
long long withLastBig[MAXN][MAXN + 1];
char v[MAXN];
vector <int> divv[MAXN + 1];
void makeDiv() {
int i, i2;
for ( i = 1; i <= MAXN; i++ ) {
for ( i2 = i; i2 <= MAXN; i2 += i ) {
divv[i2].push_back(i);
}
}
}
int main() {
int n, k, i, i2;
scanf("%d%d ", &n, &k);
for ( i = 0; i < n; i++ ) {
v[i] = fgetc(stdin);
}
dp[n - 1][0] = sumForK[0] = v[n - 1] - 'a' + 1;
dp[n - 1][1] = withLastBig[n - 1][1] = 'z' - v[n - 1];
for ( i = n - 2; i >= 0; i-- ) {
for ( i2 = 0; i2 <= k; i2++ ) {
dp[i][i2] = ((long long) dp[i][i2] + dp[i + 1][i2] * (v[i] - 'a' + (i2 == 0))) % MOD;
if ( i2 + n - i <= k ) {
dp[i][i2 + n - i] = ((long long) dp[i][i2 + n - i] + dp[i + 1][i2] * ('z' - v[i])) % MOD;
withLastBig[i][i2 + n - i] = ((long long) withLastBig[i][i2 + n - i] + dp[i + 1][i2] * ('z' - v[i])) % MOD;
}
for ( int d : divv[i2] ) {
if ( d > 1 && i + d - 1 < n ) {
dp[i][i2] = (dp[i][i2] + withLastBig[i + d - 1][i2 / d]) % MOD;
}
}
}
}
printf("%lld\n", dp[0][k]);
return 0;
}