\(\mathcal{Description}\)

  Link.

  求从 \(m\) 种颜色,每种颜色无限多的小球里选 \(n\) 个构成排列,使得每种颜色出现次数为 \(d\) 的倍数的排列方案数,对 \(19491001\) 取模。

  \(n\le10^9\),

  • \(m\le10^3\),\(d=3\);

  • \(m\le5\times10^5\),\(d\le2\)。

\(\mathcal{Solution}\)

  分 \(d=1,2,3\) 求解。

  当 \(d=1\),每个位置 \(m\) 种方案,答案为 \(m^n\)。

  当 \(d=2\),偶数序列的 EGF 为 \(G(x)=\sum_{i=0}^{+\infty}\frac{x^{2i}}{(2i)!}=\frac{e^x+e^{-x}}2\),那么答案为:

\[\begin{aligned}
n![x^n]G^m(x)&=n![x^n]\left( \frac{e^x+e^{-x}}2 \right)^m\\
&=\frac{n!}{2^m}[x^n]\left( \sum_{i=0}^m\binom{m}ie^{(2i-m)x} \right)\\
&=2^{-m}\sum_{i=0}^m\binom{m}i(2i-m)^n
\end{aligned}
\]

  第二步到第三步用到常见的 \(e^{ax}=\sum_{i=0}^{+\infty}\frac{a^i}{i!}x^i\)。此时就能 \(\mathcal O(m\log n)\) 求出答案了。

  当 \(d=3\),\(3\) 的倍数数的 EGF 为 \(G(x)=\sum_{i=0}^{+\infty}[3|i]\frac{x^i}{i!}\),这个不太好算,来一发单位根反演:

\[\begin{aligned}
G(x)&=\sum_{i=0}^{+\infty}[3|i]\frac{x^i}{i!}\\
&=\frac{1}3\sum_{i=0}^{+\infty}\frac{x^i}{i!}\sum_{j=0}^2\omega_3^{ij}\\
&=\frac{1}3\sum_{j=0}^2\sum_{i=0}^{+\infty}\frac{(\omega_3^jx)^i}{i!}\\
&=\frac{1}3\sum_{j=0}^2e^{\omega_3^jx}
\end{aligned}
\]

  接着求答案,暴力展开三项式幂:

\[\begin{aligned}
n![x^n]G^m(x)&=\frac{n!}{3^m}[x^n]\left( \sum_{j=0}^2e^{\omega_3^jx} \right)^m\\
&=\frac{n!}{3^m}[x^n]\left( \sum_{a+b+c=m}\binom{m}{a,b,c}e^{(a\omega_3^0+b\omega_3^1+c\omega_3^2)x} \right)\\
&=3^{-m}\sum_{a+b+c=m}\binom{m}{a,b,c}(a\omega_3^0+b\omega_3^1+c\omega_3^2)^n
\end{aligned}
\]

  注意到 \(c=m-a-b\),所以多重组合数的值就是 \(\frac{m!}{a!b!c!}\),该式能在 \(\mathcal O(m^2\log n)\) 的时间内算出。实际上该式就是 \(d=2\) 的情况的扩展,由于 \(\omega_2^{0,1}=\pm1\),所以亦能从该式推回 \(d=2\) 的情况。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i ) const int MOD = 19491001, MAXM = 5e5, INV2 = MOD + 1 >> 1, INV3 = 12994001;
const int W[] = { 1, 663067, 18827933 };
int n, m, d, fac[MAXM + 5], ifac[MAXM + 5]; inline int mul ( long long a, const int b ) { return a * b % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mpow ( int a, int b ) {
int ret = 1;
for ( ; b; a = mul ( a, a ), b >>= 1 ) ret = mul ( ret, b & 1 ? a : 1 );
return ret;
} inline void init () {
fac[0] = 1;
rep ( i, 1, m ) fac[i] = mul ( i, fac[i - 1] );
ifac[m] = mpow ( fac[m], MOD - 2 );
per ( i, m - 1, 0 ) ifac[i] = mul ( i + 1, ifac[i + 1] );
} inline int comb ( const int n, const int m ) {
return n < m ? 0 : mul ( fac[n], mul ( ifac[m], ifac[n - m] ) );
} int main () {
scanf ( "%d %d %d", &n, &m, &d ), init ();
if ( d == 1 ) return printf ( "%d\n", mpow ( m, n ) ), 0;
if ( d == 2 ) {
int ans = 0;
rep ( i, 0, m ) {
ans = add ( ans, mul ( comb ( m, i ), mpow ( sub ( i << 1, m ), n ) ) );
}
printf ( "%d\n", mul ( ans, mpow ( INV2, m ) ) );
return 0;
}
// $d is now smaller than 1000.
int ans = 0;
rep ( i, 0, m ) rep ( j, 0, m - i ) {
int k = m - i - j;
ans = add ( ans, mul ( mul ( ifac[i], mul ( ifac[j], ifac[k] ) ),
mpow ( add (
mul ( i, W[0] ), add ( mul ( j, W[1] ), mul ( k, W[2] ) ) ), n ) ) );
}
printf ( "%d\n", mul ( ans, mul ( fac[m], mpow ( INV3, m ) ) ) );
return 0;
}

最新文章

  1. c++ 顺序容器学习
  2. 安装Adobe系列时遇到的问题解决
  3. Windows下gvim配置
  4. Apache CXF Webservice入门
  5. AngularJS开发指南1:AngularJS简介
  6. postconf 命令常用参数
  7. EIGR的非等价均衡P
  8. SPRING IN ACTION 第4版笔记-第三章Advancing wiring-001-DataSource在应用和开发环境之间切换 profile
  9. Redis(2015.08.03笔记一)
  10. unity 单指双指事件(单指点击移动,双指滑动拖放)
  11. 以pfile或者spfile启动时show parameter pfile的不同结果
  12. 【技术文章】《初识Python》
  13. GitHub创建仓库,并与git本地仓库关联
  14. I2C总线通信
  15. grep 匹配打印的上下几行
  16. Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
  17. Linux 命令整理-tailf
  18. Wireshark 抓包小例子
  19. (转)在SDL工程中让SDL_ttf渲染汉字
  20. MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

热门文章

  1. vue 因为使用scope后选择器和标签出现[data-v
  2. [源码解析] PyTorch 分布式之 ZeroRedundancyOptimizer
  3. XSS-lab通过教程&#128054;
  4. 【Java】重载与重写
  5. Java对象内存模型
  6. 《剑指offer》面试题44. 数字序列中某一位的数字
  7. 触发器中获取sql
  8. nRF24L01无线模块笔记
  9. 【刷题-LeetCode】190 Reverse Bits
  10. WebGPU图形编程(1):建立开发环境 &lt;学习引自徐博士教程&gt;