Submission #2042287


Source Code Expand

#define _CRT_SECURE_NO_WARNINGS
#include <array>
#include <cstdio>

using namespace std;

const int INF = 1000000007;

const int MAX_N = 100;
const int MAX_K = 500;

array<int, MAX_N + MAX_K> FCT;
array<int, MAX_N + MAX_K> INV;

int modmulti(int a, int b)
{
    int res = 0;
    int mod = a % INF;
    while (b > 0)
    {
        if ((b & 1) == 1)
        {
            res += mod;
            if (res > INF)
            {
                res -= INF;
            }
        }
        mod <<= 1;
        if (mod > INF)
        {
            mod -= INF;
        }
        b >>= 1;
    }
    return res;
}

int modcalc(int a, int b)
{
    // O(log b)
    int d = 0;
    if (b == 0)
    {
        return 1;
    }
    else if ((b & 1) == 0)
    {
        // 偶数 bを半分にできる
        d = modcalc(a, b / 2);
        return modmulti(d, d);
    }
    else
    {
        // 奇数 -1乗から1乗をかける
        return modmulti(a, modcalc(a, b - 1));
    }
}

int combination(int a, int b)
{
    // tmp = a! / b!
    int tmp = modmulti(FCT[a], INV[b]);
    // tmp / (a - b)!
    return modmulti(tmp, INV[a - b]);
}

void factorial(int x)
{
    FCT[0] = 1;
    FCT[1] = 1;
    for (int i = 2; i <= x; i++)
    {
        FCT[i] = modmulti(FCT[i - 1], i);
    }
}

void inverse(int x)
{
    INV[0] = 1;
    INV[1] = 1;
    INV[x] = modcalc(FCT[x], INF - 2);
    for (int i = x - 1; 2 <= i; i--)
    {
        INV[i] = modmulti(INV[i + 1], i + 1);
    }
}

int main()
{
    int N, K;

    if (scanf("%d%d", &N, &K) < 2) return 0;

    // 階乗テーブル作成
    factorial(N + K - 1);

    // 逆元テーブル作成
    inverse(N + K - 1);

    int ans;
    if (K < N)
    {
        // 「N 種類のものから重複を許して K 個選ぶ」方法と
        // 「K 個の ○ と N-1 個の |(仕切り)を 1 列に並べる」方法は
        // 1 対 1 に対応する
        // nHk = (n+k-1)Ck

        // (n+k-1)Ck
        ans = combination(N + K - 1, K);
    }
    else
    {
        // nCk%n
        ans = combination(N, K % N);
    }

    printf("%d\n", ans);
    return 0;
}

Submission Info

Submission Time
Task B - 高橋幼稚園
User ShinjiSHIBATA
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2222 Byte
Status AC
Exec Time 1 ms
Memory 128 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 80 / 80 20 / 20
Status
AC × 3
AC × 21
AC × 33
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt
Subtask1 subtask0_sample_01.txt, subtask0_sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt
Subtask2 subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 1 ms 128 KB
subtask0_sample_02.txt AC 1 ms 128 KB
subtask0_sample_03.txt AC 1 ms 128 KB
subtask1_01.txt AC 1 ms 128 KB
subtask1_02.txt AC 1 ms 128 KB
subtask1_03.txt AC 1 ms 128 KB
subtask1_04.txt AC 1 ms 128 KB
subtask1_05.txt AC 1 ms 128 KB
subtask1_06.txt AC 1 ms 128 KB
subtask1_07.txt AC 1 ms 128 KB
subtask1_08.txt AC 1 ms 128 KB
subtask1_09.txt AC 1 ms 128 KB
subtask1_10.txt AC 1 ms 128 KB
subtask1_11.txt AC 1 ms 128 KB
subtask1_12.txt AC 1 ms 128 KB
subtask1_13.txt AC 1 ms 128 KB
subtask1_14.txt AC 1 ms 128 KB
subtask1_15.txt AC 1 ms 128 KB
subtask1_16.txt AC 1 ms 128 KB
subtask1_17.txt AC 1 ms 128 KB
subtask1_18.txt AC 1 ms 128 KB
subtask1_19.txt AC 1 ms 128 KB
subtask2_01.txt AC 1 ms 128 KB
subtask2_02.txt AC 1 ms 128 KB
subtask2_03.txt AC 1 ms 128 KB
subtask2_04.txt AC 1 ms 128 KB
subtask2_05.txt AC 1 ms 128 KB
subtask2_06.txt AC 1 ms 128 KB
subtask2_07.txt AC 1 ms 128 KB
subtask2_08.txt AC 1 ms 128 KB
subtask2_09.txt AC 1 ms 128 KB
subtask2_10.txt AC 1 ms 128 KB
subtask2_11.txt AC 1 ms 128 KB