помогите найти ошибку в коде C++. Wrong answer

Условие Необходимо вычислить число сочетаний из nпо k (Cnk). Примечание 1:;Cnk;= n! / (k! * (n - k)!)

Примечание 2: Для языков с динамической типизацией и(или) встроенными возможностями на длинную арифметику, если ваше решение подразумевает, что в процессе вычислений, вы будете получать значения, выходящие за пределы стандартных ограничений, то такие решения преподаватели могут отклонить, по правилу 17.

Входные данные В первой строке входного файла даны два;натуральных числа;n и k (1 ≤ n,;k ≤ 50, Cnk≤109 ).

Выходные данные В выходной файл необходимо вывести единственное значение - Cnk;.

Ограничения Время — 1000 ms

мой код:

#include <iostream>

#include <cmath>

using namespace std;

int main()
{
    int n, k;

    cin >> n >>k;

    long long f = 1;

    long long f1 = 1;

    long long f2 = 1;

    for (int x = 1; x <= n; x++)

    {
        f *= x;

    }
    for (int y = 1; y <= k; y++)

    {
        f1 *= y;

    }
    for (int z = 1; z <= (n - k); z++)
    {
        f2 *= z;
    }

    
    cout << f / (f1 * f2);

    return 0;
}

В некоторых тестах выдает ошибку Wrong answer. Да и код не всегда выдает число (когда ввожу 100 и 99 например )


Ответы (1 шт):

Автор решения: Harry

У вас явные переполнения...
Попробуйте

unsigned long long c = 1;
for(unsigned int i = 1; i <= k; ++i)
{
    c *= n-k+i;
    c /= i;
}
→ Ссылка