diff --git a/Luogu/P2155/P2155.cpp b/Luogu/P2155/P2155.cpp new file mode 100644 index 00000000..1d21083e --- /dev/null +++ b/Luogu/P2155/P2155.cpp @@ -0,0 +1,70 @@ +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 1e7 + 5; + +int t, mod, p, primes[N], fac[N], fac_phi[N]; +bool not_prime[N]; + +int binpow(int a, int b) { + int res = 1; + + while (b) { + if (b & 1) res = static_cast(res) * a % mod; + a = static_cast(a) * a % mod; + b >>= 1; + } + + return res; +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> t >> mod; + + for (int i = 2; i < N; i++) { + if (!not_prime[i]) primes[++p] = i; + + for (int j = 1; j <= p && i * primes[j] < N; j++) { + not_prime[i * primes[j]] = true; + + if (i % primes[j] == 0) break; + } + } + + fac[0] = 1; + + for (int i = 1; i < N; i++) { + if (i % mod) { + fac[i] = static_cast(fac[i - 1]) * i % mod; + } else { + fac[i] = fac[i - 1]; + } + } + + fac_phi[1] = 1; + + for (int i = 2; i < N; i++) { + if (not_prime[i]) { + fac_phi[i] = static_cast(fac_phi[i - 1]) * i % mod; + } else { + fac_phi[i] = static_cast(fac_phi[i - 1]) * (i - 1) % mod; + } + } + + while (t--) { + int n, m; + + cin >> n >> m; + + cout << (n / mod > m / mod ? 0 : static_cast(fac[n]) * fac_phi[m] % mod * binpow(fac[m], mod - 2) % mod) << endl; + } + + return 0; +} diff --git a/Luogu/P2155/data/P2155_2.in b/Luogu/P2155/data/P2155_2.in new file mode 100644 index 00000000..38e4e904 --- /dev/null +++ b/Luogu/P2155/data/P2155_2.in @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a65d86d408af63ab0f1c1e256f30ed69f8a6b609b61d989159c2e8bb4a91e90 +size 33 diff --git a/Luogu/P2155/data/P2155_2.out b/Luogu/P2155/data/P2155_2.out new file mode 100644 index 00000000..38ffeddc --- /dev/null +++ b/Luogu/P2155/data/P2155_2.out @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da304b038d8b466b10e2692d393861d7a45b0f190beccf6464e5905f42205b3b +size 22