Cod sursa(job #1584944)

Utilizator hrazvanHarsan Razvan hrazvan Data 30 ianuarie 2016 16:56:40
Problema Expresii 2 Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#define MAXN 30
#define CHARS 26
int n, k, dr = 0;
long long dp[MAXN + 1][MAXN + 1][CHARS + 3], p;
char s[MAXN];

void afis(FILE *out, int n, int k, int p){
  if(n > 0){
    int i;
    i = 0;
    while(dp[n][k][i] < p)
      i++;
    if(i != 0)
      p -= dp[n][k][i - 1];
    if(i == CHARS || i == CHARS + 1)
      k--;
    if(i < CHARS)
      k++;
    if(i < CHARS)
      fputc('A' + i, out);
    if(i == CHARS)
      fputc('+', out);
    if(i == CHARS + 1)
      fputc('*', out);
    if(i == CHARS + 2)
      fputc('!', out);
    afis(out, n - 1, k, p);
  }
}

int main(){
  FILE *in = fopen("expresii2.in", "r");
  fscanf(in, "%d%d%lld", &n, &k, &p);
  fclose(in);
  int i, j, l;
  for(j = 0; j < CHARS + 3; j++)
    dp[0][0][j] = 1;
  for(i = 1; i <= n - 1; i++){
    for(j = 0; j <= i; j++){
      for(l = 0; l < k; l++)
        dp[i][j][l] = dp[i - 1][j + 1][CHARS + 2];
      dp[i][j][CHARS + 2] = dp[i - 1][j][CHARS + 2];
      if(j > 0){
        dp[i][j][CHARS] = dp[i - 1][j - 1][CHARS + 2];
        dp[i][j][CHARS + 1] = dp[i - 1][j - 1][CHARS + 2];
      }
      for(l = 1; l < CHARS + 3; l++)
        dp[i][j][l] += dp[i][j][l - 1];
    }
  }
  FILE *out = fopen("expresii2.out", "w");
  fprintf(out, "%lld\n", k * dp[n - 1][0][CHARS + 2]);
  fputc((p - 1) / dp[n - 1][0][CHARS + 2] + 'A', out);
  p = (p - 1) % dp[n - 1][0][CHARS + 2] + 1;
  afis(out, n - 1, 0, p);
  fclose(out);
  return 0;
}