結果
問題 | No.117 組み合わせの数 |
ユーザー |
|
提出日時 | 2019-11-16 14:03:13 |
言語 | D (dmd 2.109.1) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,881 bytes |
コンパイル時間 | 1,471 ms |
コンパイル使用メモリ | 148,376 KB |
実行使用メモリ | 10,456 KB |
最終ジャッジ日時 | 2024-06-22 03:01:47 |
合計ジャッジ時間 | 2,650 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | RE * 1 |
ソースコード
import std.stdio, std.array, std.string, std.conv, std.algorithm;import std.typecons, std.range, std.random, std.math, std.container;import std.numeric, std.bigint, core.bitop, core.stdc.stdio;immutable long MAX = 2*10^^6+1;immutable uint MOD = 10^^9 + 7;alias mint = ModInt!MOD;void main() {auto comb = new Combinations!MOD(MAX.to!int);int T, N, K;char CPH;scanf("%d\n", &T);foreach(i; 0..T) {scanf("%c(%d,%d)\n", &CPH, &N, &K);if (CPH == 'C') {writeln(comb.nCr(N, K));}else if (CPH == 'P') {writeln(comb.nPr(N, K));}else {writeln(comb.nHr(N, K));}}}struct ModInt(uint mod) {import std.conv : to;uint n;this(int n) {this.n = (n % mod + mod) % mod;}this(long n) {this.n = (n % mod + mod) % mod;}private this(uint n) {this.n = n;}string toString() {return to!string(this.n);}private uint normilize(uint n) const {return n < mod ? n : n - mod;}private ModInt pow(uint n, long x) const {long ret = 1;long a = n;while (x) {if (x & 1) ret = ret * a % mod;a = a * a % mod;x >>= 1;}return ModInt(to!ulong(ret));}ModInt opBinary(string op : "+")(ModInt rhs) const {return ModInt(normilize(n + rhs.n));}ModInt opBinary(string op : "-")(ModInt rhs) const {return ModInt(normilize(n + mod - rhs.n));}ModInt opBinary(string op : "*")(ModInt rhs) const {return ModInt(to!uint(to!long(n) * rhs.n % mod));}ModInt opBinary(string op : "/")(ModInt rhs) const {return this * pow(rhs.n, mod-2);}ModInt opBinary(string op : "^^")(ModInt rhs) const {return pow(this.n, rhs.n);}ModInt opBinary(string op, T)(T rhs) {ModInt mod_rhs = ModInt(rhs);return opBinary!op(mod_rhs);}ModInt opOpAssign(string op)(ModInt rhs) {return mixin ("this=this"~op~"rhs");}ModInt opOpAssign(string op, T)(T rhs) {ModInt mod_rhs = ModInt(rhs);return mixin ("this=this"~op~"mod_rhs");}}class Combinations(uint mod) {alias mint = ModInt!mod;mint[] f;this(int maxval) {auto f = new mint[](maxval);f[0] = f[1] = mint(1);foreach(i; 2..maxval) {f[i] = f[i-1] * i;}}mint nCr(int n, int r) {if (n < r) mint(0);return f[n] / f[n-r] / f[r];}mint nPr(int n, int r) {if (n < r) return mint(0);return f[n] / f[n-r];}mint nHr(int n, int r) {if (n == 0 &&r == 0) return mint(1);if (n == 0) return mint(0);return f[n+r-1] / f[n-1] / f[r];}}