結果
| 問題 |
No.117 組み合わせの数
|
| コンテスト | |
| ユーザー |
yoshnary
|
| 提出日時 | 2019-04-24 02:57:00 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,667 bytes |
| コンパイル時間 | 1,040 ms |
| コンパイル使用メモリ | 97,208 KB |
| 実行使用メモリ | 34,904 KB |
| 最終ジャッジ日時 | 2024-11-06 19:23:03 |
| 合計ジャッジ時間 | 2,424 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 1 |
ソースコード
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <unordered_map>
#include <set>
#include <functional>
#include <bitset>
#include <cassert>
using namespace std;
typedef long long ll;
struct Mint {
static const ll mod = (ll)(1e9 + 7);
ll val;
Mint() { val = 0; }
Mint(ll a) {
val = a;
verify_value();
}
void verify_value() {
if (val >= mod) val %= mod;
if (val < 0) val %= mod, val += mod;
}
Mint pow(ll p) const {
Mint cur = Mint(val), ret = 1;
while (p > 0) {
if (p & 1) ret *= cur;
cur *= cur;
p >>= 1LL;
}
return ret;
}
Mint inv() const {
if (val == 0) cerr << "CAUTION: inv() is called with 0." << endl;
return pow(mod - 2);
}
Mint operator+() const { return *this; }
Mint operator-() const { return Mint(mod - val); }
Mint operator+=(const Mint &a) {
val += a.val;
if (val >= mod) val -= mod;
return Mint(val);
}
Mint operator*=(const Mint &a) {
val *= a.val;
if (val >= mod) val %= mod;
return Mint(val);
}
Mint operator-=(const Mint &a) { return *this += -a; }
Mint operator/=(const Mint &a) { return *this *= a.inv(); }
Mint operator++() { return *this += Mint(1); }
Mint operator--() { return *this -= Mint(1); }
Mint operator++(int) {
Mint ret = *this;
++(*this);
return ret;
}
Mint operator--(int) {
Mint ret = *this;
--(*this);
return ret;
}
};
Mint operator+(const Mint &a, const Mint &b) {
ll ret = a.val + b.val;
if (ret >= Mint::mod) ret -= Mint::mod;
return Mint(ret);
}
Mint operator*(const Mint &a, const Mint &b) {
ll ret = a.val * b.val;
if (ret >= Mint::mod) ret %= Mint::mod;
return Mint(ret);
}
Mint operator-(const Mint &a, const Mint &b) { return a + (-b); }
Mint operator/(const Mint &a, const Mint &b) { return a * b.inv(); }
ostream &operator<<(ostream &out, const Mint &a) { return out << a.val; }
istream &operator>>(istream &in, Mint &a) {
in >> a.val;
a.verify_value();
return in;
}
constexpr int MAX_N = 2000003;
Mint fact[MAX_N], inv[MAX_N];
void init_fact() {
fact[0] = inv[0] = 1;
for (ll i = 1; i < MAX_N; i++) {
fact[i] = fact[i - 1] * i;
inv[i] = fact[i].inv();
}
}
// aCb
Mint C(int a, int b) {
if (a < b) return 0;
Mint res = fact[a];
res *= inv[b];
res *= inv[a - b];
return res;
}
// aPb
Mint P(int a, int b) {
if (a < b) return 0;
return fact[a] * inv[a - b];
}
int main() {
init_fact();
int T; cin >> T;
while (T--) {
char c; int a, b;
scanf(" %c(%d,%d)", &c, &a, &b);
if (c == 'C') cout << C(a, b) << endl;
else if (c == 'P') cout << P(a, b) << endl;
else cout << C(a + b - 1, b) << endl;
}
return 0;
}
yoshnary