Cod sursa(job #2971117)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 26 ianuarie 2023 17:34:01
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#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;
}