From 6fcc52aaf76ec5f8e08aeaf354afdcf6e444926e Mon Sep 17 00:00:00 2001 From: Baoshuo Date: Mon, 18 Jul 2022 10:13:33 +0800 Subject: [PATCH] =?UTF-8?q?P1313=20[NOIP2011=20=E6=8F=90=E9=AB=98=E7=BB=84?= =?UTF-8?q?]=20=E8=AE=A1=E7=AE=97=E7=B3=BB=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://www.luogu.com.cn/record/80041822 --- Luogu/P1313/P1313.cpp | 67 +++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/Luogu/P1313/P1313.cpp b/Luogu/P1313/P1313.cpp index 61e8d3cc..cb659c5b 100644 --- a/Luogu/P1313/P1313.cpp +++ b/Luogu/P1313/P1313.cpp @@ -1,4 +1,6 @@ #include +#include +#include using std::cin; using std::cout; @@ -7,8 +9,57 @@ const char endl = '\n'; const int N = 1005; const int mod = 1e4 + 7; +template +using number = std::integral_constant; + +template +struct factorial : number(n) * factorial::value % mod> {}; + +template <> +struct factorial<0> : number<1> {}; + +template +constexpr std::array get_factorial_table_impl(std::integer_sequence) { + return {factorial::value...}; +} + +template +constexpr auto get_factorial_table() { + return get_factorial_table_impl(std::make_integer_sequence{}); +} + +template +struct inverse : number(mod - (mod / n)) * inverse::value % mod> {}; + +template <> +struct inverse<1> : number<1> {}; + +template <> +struct inverse<0> : number<1> {}; + +template +struct factorial_inverse : number(factorial_inverse::value) * inverse::value % mod> {}; + +template <> +struct factorial_inverse<1> : number<1> {}; + +template <> +struct factorial_inverse<0> : number<1> {}; + +template +constexpr std::array get_factorial_inverse_table_impl(std::integer_sequence) { + return {factorial_inverse::value...}; +} + +template +constexpr auto get_factorial_inverse_table() { + return get_factorial_inverse_table_impl(std::make_integer_sequence{}); +} + int a, b, k, n, m; -int fac[N], inv[N]; + +constexpr auto fac = get_factorial_table(), + inv = get_factorial_inverse_table(); int binpow(int a, int b) { int res = 1; @@ -29,20 +80,6 @@ int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); - fac[0] = 1; - for (int i = 1; i <= 1000; i++) { - fac[i] = 1ll * fac[i - 1] * i % mod; - } - - inv[0] = inv[1] = 1; - for (int i = 2; i <= 1000; i++) { - inv[i] = static_cast(mod - (mod / i)) * inv[mod % i] % mod; - } - - for (int i = 2; i <= 1000; i++) { - inv[i] = static_cast(inv[i - 1]) * inv[i] % mod; - } - cin >> a >> b >> k >> n >> m; cout << static_cast(C(k, n)) * binpow(a, n) % mod * binpow(b, m) % mod << endl;