結果
問題 |
No.109 N! mod M
|
ユーザー |
|
提出日時 | 2025-08-28 19:30:25 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 94 ms / 5,000 ms |
コード長 | 1,067 bytes |
コンパイル時間 | 1,931 ms |
コンパイル使用メモリ | 195,952 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-08-28 19:30:32 |
合計ジャッジ時間 | 3,140 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 9 |
ソースコード
module main; // http://rsujskf.s602.xrea.com/?yukicoder_109 より import std; // https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a より long modInv(long a, long m) { long b = m, u = 1, v = 0; while (b) { long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } u %= m; if (u < 0) u += m; return u; } // 素数判定(総当たり) bool isPrime(long x) { if (x <= 1) return false; if (x == 2) return true; if (x % 2 == 0) return false; for (long i = 3; i * i <= x; i += 2) { if (x % i == 0) return false; } return true; } void main() { // キューの処理 int T = readln.chomp.to!int; foreach (_; 0 .. T) { long N, M; readln.chomp.formattedRead("%d %d", N, M); if (M <= N || M == 1) { writeln(0); continue; } if (N <= 300_000) { long res = 1; foreach (i; 1 .. N + 1) res = res * i % M; writeln(res); continue; } if (!isPrime(M)) { writeln(0); continue; } long mul = 1; foreach (i; N + 1 .. M) { mul = mul * i % M; } long res = (M - 1) * modInv(mul, M) % M; writeln(res); } }