P
P
PRIYD2020-12-27 18:47:41
Algorithms
PRIYD, 2020-12-27 18:47:41

What's wrong with using long arithmetic?

Hello, I solved the problem (the condition under the spoiler) and, it seems, I solved it correctly, but it falls on the 10th test. As far as I understand, the problem is in my incorrect implementation of long arithmetic. I would be grateful for help.

Condition
В нашем зоопарке появился заяц. Его поместили в клетку, и чтобы ему не было скучно, директор зоопарка распорядился поставить в его клетке лесенку. Теперь наш зайчик может прыгать по лесенке вверх, перепрыгивая через ступеньки. Лестница имеет определенное количество ступенек N. Заяц может одним прыжком преодолеть не более К ступенек. Для разнообразия зайчик пытается каждый раз найти новый путь к вершине лестницы. Директору любопытно, сколько различных способов есть у зайца добраться до вершины лестницы при заданных значениях K и N. Помогите директору написать программу, которая поможет вычислить это количество. Например, если K=3 и N=4, то существуют следующие маршруты: 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1. Т.е. при данных значениях у зайца всего 7 различных маршрутов добраться до вершины лестницы.

Входные данные
В единственной строке входного файла INPUT.TXT записаны два натуральных числа K и N (1 ≤ K ≤ N ≤ 300). К - максимальное количество ступенек, которое может преодолеть заяц одним прыжком, N – общее число ступенек лестницы.

Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести количество возможных вариантов различных маршрутов зайца на верхнюю ступеньку лестницы без ведущих нулей.

The code
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
typedef unsigned long long ull;

const ull BASE = 1e9;
const ull SIZE = 15;

vector<ull> formBI(ull num) {
  vector<ull> res(SIZE, 0);

  short i = 0;
  while (num) {
    res[i++] = num % BASE;
    num /= BASE;
  } 

  return res;
} 

vector<ull> sum(vector<ull> n1, vector<ull> n2) {
  for (size_t i=0; i<SIZE; i++) {
    n1[i] += n2[i];
  }	

  for (size_t i=0; i<SIZE-1; i++) {
    if (n1[i]>=BASE) {
      n1[i] -= BASE;
      n1[i+1]++;
    }
  }
  
  return n1;
}

void print(vector<ull> n) {
  reverse(n.begin(), n.end());

  for(size_t i=0; i<SIZE; i++) {
    if (n[i]!=0) {
      cout << n[i];
    }
  }	

  cout << endl;
}

int main() {
  short k, n;
  cin >> k >> n;
  
  vector<ull> emp(SIZE, 0);
  vector<vector<ull>> b(n+1, emp); 
  b[0] = formBI(1);
  
  for (size_t i=1; i<n+1; i++) {
    short r = (i<k) ? i : k;
    
    for (size_t j=1; j<=r; j++) {
      b[i] = sum(b[i], b[i-j]);
    }
  }

  print(b[n]);
  return 0;
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
W
Wataru, 2020-12-27
@PRIYD

The problem is in the output. You do not display zero digits at all:

for(size_t i=0; i<SIZE; i++) {
  if (n[i]!=0) {
    cout << n[i];
  }
}

And you need to skip only leading zeros. The easiest way to fix it is to start bool printed:
bool printed = false;
for(size_t i=0; i<SIZE; i++) {
  if (printed || n[i]!=0) {
    cout << n[i];
    printed = true;
  }
}

Well, it might also be worth increasing the size of the long numbers. Not the fact that 135 digits will suffice. Enter test n=300, k=300, and check that the same answer is output for the current and increased SIZE.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question