結果
| 問題 | No.109 N! mod M |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-12-09 07:42:58 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2,721 ms / 5,000 ms |
| コード長 | 1,177 bytes |
| コンパイル時間 | 512 ms |
| コンパイル使用メモリ | 68,520 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-22 05:03:05 |
| 合計ジャッジ時間 | 4,183 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
ソースコード
#include <cassert>
#include <iostream>
#include <map>
#define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++)
using namespace std;
typedef long long int ll;
ll powmod(ll x, ll e, ll mod) {
ll sum = 1 % mod;
ll cur = x % mod;
while (e > 0) {
if (e % 2) {
sum = sum * cur % mod;
}
cur = cur * cur % mod;
e /= 2;
}
return sum;
}
ll solve(ll n, ll m) {
if (n >= m) {
return 0;
}
if (m == 1) {
return 0;
}
// factorize m
map<ll, int> fact;
{
ll p = 2;
ll v = m;
while (v > 1 && p * p <= v) {
int cnt = 0;
while (v % p == 0) {
v /= p;
cnt++;
}
if (cnt > 0) {
fact[p] = cnt;
}
if (p == 2) { p = 3; }
else { p += 2; }
}
if (v > 1) {
fact[v] = 1;
}
}
if (fact.count(m) == 1) { // m is a prime
ll sum = m - 1;
REP(i, 1, m - n) {
sum = sum * powmod(m - i, m - 2, m) % m;
}
return sum;
}
if (m >= 300000) {
return 0;
}
ll sum = 1;
REP(i, 1, n + 1) {
sum = sum * i % m;
}
return sum;
}
int main(void){
int t;
cin >> t;
while (t--) {
ll m, n;
cin >> n >> m;
cout << solve(n, m) << endl;
}
}