結果
| 問題 |
No.117 組み合わせの数
|
| コンテスト | |
| ユーザー |
Ryu
|
| 提出日時 | 2018-06-10 14:17:02 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 689 ms / 5,000 ms |
| コード長 | 1,929 bytes |
| コンパイル時間 | 1,544 ms |
| コンパイル使用メモリ | 169,104 KB |
| 実行使用メモリ | 50,040 KB |
| 最終ジャッジ日時 | 2024-06-30 13:16:34 |
| 合計ジャッジ時間 | 3,352 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 |
ソースコード
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, init, n) for (int i = init; i < (n); i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define fi first
#define se second
using namespace std;
using ll = long long int;
using P = pair<int, int>;
using T = tuple<int, int, int>;
using edge = struct
{
int to, cost;
};
const int MOD = 1e9 + 7;
const int iINF = 1e9;
const long long int llINF = 1e18;
const double PI = acos(-1.0);
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
const int MAX = 3000000;
vector<ll> fac(MAX + 1);
vector<ll> modFac(MAX + 1);
ll powMod(ll n, ll p)
{
ll ans = 1;
while (p != 0)
{
if (p & 1)
ans = ans * n % MOD;
n = n * n % MOD;
p = p >> 1;
}
return ans;
}
ll comb(ll n, ll r)
{
if (n == 0 && r == 0)
return 1;
if (n < r || n < 0)
return 0;
return (fac[n] * modFac[r]) % MOD * modFac[n - r] % MOD;
}
ll dupc(ll n, ll r)
{
if (n == 0 && r == 0)
return 1;
if (n <= 0 || r < 0)
return 0;
return ((fac[n + r - 1] * modFac[n - 1]) % MOD * modFac[r]) % MOD;
}
ll perm(ll n, ll r)
{
if(r < 0 || n < r)
return 0;
return (fac[n] * modFac[n - r]) % MOD;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
fac[0] = 1;
modFac[0] = 1;
REP(i, MAX)
{
fac[i + 1] = (fac[i] * (i + 1)) % MOD;
modFac[i + 1] = modFac[i] * powMod(i + 1, MOD - 2) % MOD;
}
int T, N, K;
cin >> T;
char com, a, b, c, d;
REP(i, T)
{
cin >> com >> a >> N >> b >> K >> c;
ll ans;
if(com == 'P')
{
ans = perm(N, K);
}
else if(com == 'C')
{
ans = comb(N, K);
}
else
{
ans = dupc(N, K);
}
cout << ans << endl;
}
return 0;
}
Ryu