結果

問題 No.117 組み合わせの数
ユーザー masamasa
提出日時 2016-06-16 19:58:39
言語 C++11
(gcc 11.4.0)
結果
TLE  
実行時間 -
コード長 1,138 bytes
コンパイル時間 574 ms
コンパイル使用メモリ 63,668 KB
実行使用メモリ 12,412 KB
最終ジャッジ日時 2024-10-09 16:35:24
合計ジャッジ時間 13,032 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:59:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   59 |         scanf("%d\n", &t);
      |         ~~~~~^~~~~~~~~~~~
main.cpp:61:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   61 |                 scanf("%c(%d,%d)\n", &c, &n, &k);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~

ソースコード

diff #

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>

using namespace std;

const int mod = 1e9 + 7;

int calc_p(int n, int k) {
	if (n < k) {
		return 0;
	}

	long long ret = 1;
	for (int i = 0; i < k; i++) {
		ret = ret * (n - i) % mod;
	}
	return ret;
}

int calc_c(int n, int k) {
	if (n < k) {
		return 0;
	}

	k = min(k, n - k);
	vector<int> factor;
	for (int i = 0; i < k; i++) {
		factor.emplace_back(n - i);
	}

	for (int i = k; i > 1; i--) {
		for (int j = factor.size() - 1; j >= 0; j--) {
			if (factor[j] % i == 0) {
				factor[j] /= i;
				break;
			}
		}
	}

	long long ret = 1;
	for (auto e : factor) {
		ret = ret * e % mod;
	}
	return ret;
}

int calc_h(int n, int k) {
	return calc_c(n - 1 + k, k);
}


int main() {
	int t, n, k, ans;
	char c;

	scanf("%d\n", &t);
	for (int i = 0; i < t; i++) {
		scanf("%c(%d,%d)\n", &c, &n, &k);
		switch (c) {
		case 'P': ans = calc_p(n, k); break;
		case 'C': ans = calc_c(n, k); break;
		case 'H': ans = calc_h(n, k); break;
		default: break;
		}
		// printf("%d: %d%c%d = %d\n", i, n, c, k, ans);
		printf("%d\n", ans);
	}
	return 0;
}
0