Face questions
Resolve
By $ m $ herein indicates the original title $ k $
Disposed of $ I $ th repeater repeat $ t_i $ times, the final answer is equal to: {! \ Prod t_i} $$ \ sum _ {\ sum_ {i = 1} ^ mt_i = n} \ frac {! N} \ prod [ d |! t_i] \\ = n \ sum _ {\ sum_ {i = 1} ^ mt_i = n} \ prod \ frac {[d | t_i]} {t_i!} $$
Structure generating function $ A (x) = \ sum_ {i = 0} ^ {\ infty} [d | i] \ frac {1} {! I} x ^ i $, then the answer is equal to $ A ^ m $ a $ n $ times coefficient multiplied by $ n! $
用单位根反演化简$A(x)$:$$\begin{align*}A(x)&=\sum_{i=0}^{\infty}[d|i]\frac{1}{i!}x^i\\&=\sum_{i=0}^{\infty}\frac{x^i}{i!}*\frac{1}{d}\sum_{j=0}^{d-1}w_d^{ij}\\&=\frac{1}{d}\sum_{j=0}^{d-1}\sum_{i=0}^{\infty}\frac{(w_d^j)^i}{i!}x^i\\&=\frac{1}{d}\sum_{j=0}^{d-1}e^{w_d^jx}\end{align*}$$
$$A^m=\frac{1}{d^m}(\sum_{j=0}^{d-1}e^{w_d^jx})^m$$
$ $ D = 1, the answer is $ m ^ n $
$d=2$时,$$\begin{align*}A^m&=\frac{1}{d^m}(\sum_{j=0}^{d-1}e^{w_d^jx})^m\\&=\frac{1}{2^m}(e^{w_2^0x}+e^{w_2^1x})^m\\&=\frac{1}{2^m}\sum_{i=0}^{m}\binom{m}{i}e^{(w_2^0i+w_2^1(m-i))x}\end{align*}$$
答案为:$$\begin{align*}Ans&=n!*\frac{1}{2^m}\sum_{i=0}^m\binom{m}{i}\frac{(w_2^0i+w_2^1(m-i))^n}{n!}\\&=\frac{1}{2^m}\sum_{i=0}^m\binom{m}{i}(w_2^0i+w_2^1(m-i))^n\end{align*}$$
$d=3$时,$$\begin{align*}A^m&=\frac{1}{d^m}(\sum_{j=0}^{d-1}e^{w_d^jx})^m\\&=\frac{1}{3^m}(e^{w_3^0x}+e^{w_3^1x}+e^{w_3^2x})^m\\&=\frac{1}{3^m}\sum_{i=0}^{m}\sum_{j=0}^{m-i}\binom{m}{i}\binom{m-i}{j}e^{(w_3^0i+w_3^1j+w_3^2(m-i-j))x}\end{align*}$$
答案为:$$\begin{align*}Ans&=n!*\frac{1}{3^m}\sum_{i=0}^m\sum_{j=0}^{m-i}\binom{m}{i}\binom{m-i}{j}\frac{(w_3^0i+w_3^1j+w_3^2(m-i-j))^n}{n!}\\&=\frac{1}{3^m}\sum_{i=0}^m\sum_{j=0}^{m-i}\binom{m}{i}\binom{m-i}{j}(w_3^0i+w_3^1j+w_3^2(m-i-j))^n\end{align*}$$
Unit root $ w_d ^ 1 = g ^ {\ frac {mod-1} {d}} $, $ g $ $ MOD $ is a primitive root of this problem is equal to $ 7 $
$O(M^{d-1}\log N)$
Code:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int mod = 19491001; int add(int x, int y) { return x + y < mod? x + y: x + y - mod; } int rdc(int x, int y) { return x - y < 0? x - y + mod: x - y; } ll qpow(ll x, int y) { ll ret = 1; while(y) { if(y&1) ret = ret * x % mod; x = x * x % mod; y >>= 1; } return ret; } int n, m, d; namespace d2{ void work() { ll ans = 0, mul = 1; for(int i = 0; i <= m; ++i) { ans = add(ans, qpow(rdc(2 * i, m), n) * mul % mod); mul = (mul * (m - i) % mod) * qpow(i + 1, mod - 2) % mod; } printf("%lld", ans * qpow(qpow(2, m), mod - 2) % mod); } } namespace d3{ ll c[1005][1005]; void init() { for(int i = 0; i <= m; ++i) { c[i][0] = 1; for(int j = 1; j <= i; ++j) c[i][j] = add(c[i-1][j-1], c[i-1][j]); } } void work() { init(); ll w1 = qpow(7, (mod - 1) / 3), w2 = w1 * w1 % mod, ans = 0; for(int i = 0; i <= m; ++i) for(int j = 0; j <= m - i; ++j) ans = add(ans, (c[m][i] * c[m-i][j] % mod) * qpow(add(i, add(w1 * j % mod, w2 * (m - i - j) % mod)), n) % mod); printf("%lld", ans * qpow(qpow(3, m), mod - 2) % mod); } } int main() { scanf("%d%d%d", &n, &m, &d); if(d == 1) { printf("%lld", qpow(m, n)); return 0; } if(d == 2) d2::work(); else d3::work(); return 0; }