結果
問題 | No.109 N! mod M |
ユーザー | suisen |
提出日時 | 2021-04-23 18:57:27 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,449 bytes |
コンパイル時間 | 2,273 ms |
コンパイル使用メモリ | 203,744 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-04 07:16:06 |
合計ジャッジ時間 | 2,998 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 77 ms
6,940 KB |
testcase_02 | AC | 99 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | AC | 9 ms
6,944 KB |
testcase_08 | AC | 2 ms
6,940 KB |
ソースコード
#include<bits/stdc++.h> #include <bits/stdc++.h> using namespace std; using int128 = __int128_t; #define rep(i, n) for (int i = 0; i < n; ++i) #define reps(i, n, s) for (int i = 0; i < n; i += s) #define repl(i, l, r) for (int i = l; i < r; ++i) #define repsl(i, l, r, s) for (int i = l; i < r; i += s) #define all(iterable) (iterable).begin(), (iterable).end() constexpr int dx4[4] = {1, 0, -1, 0}; constexpr int dy4[4] = {0, 1, 0, -1}; constexpr int dx8[8] = {1, 1, 0, -1, -1, -1, 0, 1}; constexpr int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1}; template <typename T> void print(const vector<T>& vec, const string sep = " ", const string end = "\n") { int n = vec.size(); rep(i, n) { cout << vec[i]; if (i < n - 1) cout << sep; else cout << end; } } template <typename T> void read(vector<T>& a, int begin_index, int length) { if (a.size() < begin_index + length) a.resize(begin_index + length); while (length --> 0) cin >> a[begin_index++]; } template <typename T> void read(vector<T>& a) { read(a, 0, a.size()); } // returns {x,y,g} s.t. ax+by=g=gcd(a,b)>=0. std::tuple<long long, long long, long long> ext_gcd(long long a, long long b) { long long x = 1, y = 0; long long z = 0, w = 1; long long tmp; while (b) { long long p = a / b, q = a % b; tmp = x - y * p; x = y; y = tmp; tmp = z - w * p; z = w; w = tmp; a = b; b = q; } if (a >= 0) return {x, z, a}; else return {-x, -z, -a}; } // returns {x,g} s.t. a*x=g (mod m) std::pair<long long, long long> gcd_inv(long long a, long long m) { auto [x, y, g] = ext_gcd(a, m); return {x, g}; } // returns x s.t. a*x=1 (mod m) if exists, otherwise throws runtime error. long long inv_mod(long long a, long long mod) { auto [inv, y, g] = ext_gcd(a, mod); assert(g == 1); return inv; } int solve(int n, int m) { if (m <= n) return 0; if (m <= 200000) { long long fac = 1 % m; repl(i, 1, n + 1) fac = fac * i % m; return fac; } for (int i = 2; i * i <= m; ++i) { if (m % i == 0) return 0; } long long num = m - 1; long long den = 1; repl(i, n + 1, m) { den = den * i % m; } return num * inv_mod(den, m) % m; } int main() { size_t t; cin >> t; while (t --> 0) { size_t n, m; cin >> n >> m; cout << solve(n, m) << '\n'; } return 0; }