結果
問題 |
No.109 N! mod M
|
ユーザー |
|
提出日時 | 2025-06-24 14:56:39 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 111 ms / 5,000 ms |
コード長 | 1,184 bytes |
コンパイル時間 | 2,254 ms |
コンパイル使用メモリ | 196,160 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-06-24 14:56:43 |
合計ジャッジ時間 | 3,170 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 9 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define FOR(i, n) for (ll i = 0; (i) < (ll)(n); ++(i)) #define FOR3(i, m, n) for (ll i = (m); (i) < (ll)(n); ++(i)) #define FOR_R(i, n) for (ll i = (ll)(n)-1; (i) >= 0; --(i)) #define FOR3_R(i, m, n) for (ll i = (ll)(n)-1; (i) >= (ll)(m); --(i)) template<class T> void dump(T x){ cout<<x<<endl;} void extended_euclid(ll x,ll y,ll *c,ll *a,ll *b){ ll a0,a1,a2,b0,b1,b2,r0,r1,r2,q; r0=x; r1=y; a0=1; a1=0; b0=0; b1=1; while(r1>0){ q=r0/r1; r2=r0%r1; a2=a0-q*a1; b2=b0-q*b1; r0=r1; r1=r2; a0=a1; a1=a2; b0=b1; b1=b2; } *c=r0; *a=a0; *b=b0; } ll get_inv(ll n, ll p){ ll a,b,c; extended_euclid(n,p,&c,&a,&b); if(a<p) a+=p; return a%p; } void solve(){ ll N,M; cin>>N>>M; if(N>=M) return dump(0); if(N<=300000){ ll res=1%M; FOR3(i,1,N+1) res=res*i%M; return dump(res); } FOR3(i,2,sqrt(M)+1){ if(M%i==0) return dump(0); } ll res=M-1; ll mul=1; FOR3_R(i,N+1,M){ mul=mul*i%M; } dump(res*get_inv(mul,M)%M); } int main(){ ios::sync_with_stdio(0); cin.tie(0); int t=1; cin>>t; for(;t--;) solve(); }