結果
| 問題 | No.109 N! mod M |
| コンテスト | |
| ユーザー |
imgry22
|
| 提出日時 | 2014-12-27 00:21:40 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 94 ms / 5,000 ms |
| コード長 | 2,419 bytes |
| コンパイル時間 | 1,542 ms |
| コンパイル使用メモリ | 159,468 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-22 04:49:19 |
| 合計ジャッジ時間 | 2,471 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pair<int, int> > vii;
#define rrep(i, m, n) for(int (i)=(m); (i)<(n); (i)++)
#define erep(i, n) for(int (i)=1; (i)<=(n); (i)++)
#define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
#define rrev(i, m, n) for(int (i)=(n)-1; (i)>=(m); (i)--)
#define erev(i, n) for(int (i)=(n); (i)>=1; (i)--)
#define rev(i, n) for(int (i)=(n)-1; (i)>=0; (i)--)
#define vrep(i, c) for(__typeof((c).begin())i=(c).begin(); i!=(c).end(); i++)
#define ALL(v) (v).begin(), (v).end()
#define mp make_pair
#define pb push_back
template<class T1, class T2> inline void minup(T1& m, T2 x){ if(m>x) m=static_cast<T2>(x); }
template<class T1, class T2> inline void maxup(T1& m, T2 x){ if(m<x) m=static_cast<T2>(x); }
#define INF 1000000000
#define MOD 1000000009
#define EPS 1E-9
ll extgcd(ll a, ll b, ll& x, ll& y)
{
ll d = a;
if(b != 0){
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else{
x = 1;
y = 0;
}
return d;
}
ll modInverse(ll a, ll m)
{
ll x, y;
extgcd(a, m, x, y);
return (m + x % m) % m;
}
#define MAX_T 100
#define MAX_M 1000000000
int t;
ll n[MAX_T];
ll m[MAX_T];
ll lim;
ll prime[10000000];
bool isPrime[MAX_M+1];
int ptr;
int main()
{
cin >> t;
rep(i, t) cin >> n[i] >> m[i];
rep(i, t) if(n[i] < m[i]) maxup(lim, m[i]);
lim = MAX_M;
prime[ptr++] = 2;
for(ll i=3; i<=sqrt(lim); i+=2LL){
if(!isPrime[i]){
for(ll j=2*i; j<=sqrt(lim); j+=i){
isPrime[j] = true;
}
prime[ptr++] = i;
}
}
rep(i, t){
if(n[i] >= m[i]){
puts("0");
continue;
}
ll sum = 0LL;
ll pi = 1LL;
rep(j, ptr){
if(pi * prime[j] > m[i]) break;
ll p;
for(p=prime[j]; m[i]%p==0; p*=prime[j]);
p /= prime[j];
if(p == 1LL) continue;
pi *= p;
if(n[i] >= p) continue;
ll r = 1LL;
erep(k, n[i]%p) r = (r * k) % p;
sum = (sum + ((((m[i]/p) * r) % m[i]) * modInverse(m[i]/p, p)) % m[i]) % m[i];
}
ll r = 1LL;
ll p = m[i] / pi;
rrep(k, n[i]+1, p-1) r = (r * k) % p;
r = modInverse(r, p);
if(n[i] < p) sum = (sum + ((((m[i]/p) * r) % m[i]) * modInverse(m[i]/p, p)) % m[i]) % m[i];
if(n[i]+1 == p && pi == 1LL) sum = n[i];
printf("%lld\n", sum);
continue;
}
return 0;
}
imgry22