link

Description

懒得写了。

Solution

设 \(f(x)\) 表示对于一个位置操作了 \(x\) 次后刚好变为 \(1\) 的方案数,可以看出的是 \(f(x)\) 同样也是对于一个位置在操作了 \(x-1\) 次后仍没有变为 \(1\) 的方案数。

可以想到的是,第 \(i\) 个位置结束的方案数就是:

\[\sum_{x=0} f(x+1)^{i-1}f(x)^{k-i+1}
\]

考虑如何求 \(f(x)\) ,可以想到 \(f(x)\) 对应的是:有 \(m\) 种球,每种有 \(e_i\) 个,分到 \(x\) 个盒子中,不允许有盒子空着的方案数。设 \(g(x)=\prod_{i=1}^{m} \binom{e_i+x-1}{x-1}\),那么我们就可以容斥得到 \(f(x)\):

\[f(x)=\sum_{i=0}^{x} (-1)^{x-i}g(i)\binom{x}{i}
\]

直接卷就好了。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define Int register int
  4. #define mod 985661441
  5. #define MAXN 1000005
  6. template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
  7. template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
  8. template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
  9. template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
  10. template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}
  11. int up = 400000,fac[MAXN],ifac[MAXN];
  12. int mul (int a,int b){return 1ll * a * b % mod;}
  13. int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
  14. int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
  15. int qkpow (int a,int b){
  16. int res = 1;for (;b;b >>= 1,a = mul (a,a)) if (b & 1) res = mul (res,a);
  17. return res;
  18. }
  19. void Sub (int &a,int b){a = dec (a,b);}
  20. void Add (int &a,int b){a = add (a,b);}
  21. int binom (int a,int b){return a >= b ? mul (fac[a],mul (ifac[b],ifac[a - b])) : 0;}
  22. #define SZ(A) ((A).size())
  23. typedef vector<int> poly;
  24. int w[MAXN],rev[MAXN];
  25. void init_ntt(){
  26. int lim = 1 << 18;
  27. for (Int i = 0;i < lim;++ i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << 17);
  28. int Wn = qkpow (3,(mod - 1) / lim);w[lim >> 1] = 1;
  29. for (Int i = lim / 2 + 1;i < lim;++ i) w[i] = mul (w[i - 1],Wn);
  30. for (Int i = lim / 2 - 1;~i;-- i) w[i] = w[i << 1];
  31. }
  32. void ntt (poly &a,int type){
  33. #define G 3
  34. #define Gi 328553814
  35. static int d[MAXN];int lim = a.size();
  36. for (Int i = 0,z = 18 - __builtin_ctz(lim);i < lim;++ i) d[rev[i] >> z] = a[i];
  37. for (Int i = 1;i < lim;i <<= 1)
  38. for (Int j = 0;j < lim;j += i << 1)
  39. for (Int k = 0;k < i;++ k){
  40. int x = mul (w[i + k],d[i + j + k]);
  41. d[i + j + k] = dec (d[j + k],x),d[j + k] = add (d[j + k],x);
  42. }
  43. for (Int i = 0;i < lim;++ i) a[i] = d[i] % mod;
  44. if (type == -1){
  45. reverse (a.begin() + 1,a.begin() + lim);
  46. for (Int i = 0,Inv = qkpow (lim,mod - 2);i < lim;++ i) a[i] = mul (a[i],Inv);
  47. }
  48. #undef G
  49. #undef Gi
  50. }
  51. poly operator * (poly A,poly B){
  52. int lim = 1,l = 0,len = SZ(A) + SZ(B) - 1;
  53. while (lim < SZ(A) + SZ(B)) lim <<= 1,++ l;
  54. A.resize (lim),B.resize (lim),ntt (A,1),ntt (B,1);
  55. for (Int i = 0;i < lim;++ i) A[i] = mul (A[i],B[i]);
  56. ntt (A,-1),A.resize (len);
  57. return A;
  58. }
  59. poly operator * (poly a,int b){
  60. for (Int i = 0;i < SZ(a);++ i) a[i] = mul (a[i],b);
  61. return a;
  62. }
  63. poly operator + (poly a,poly b){
  64. int len = max (SZ(a),SZ(b));
  65. a.resize (len),b.resize (len);
  66. for (Int i = 0;i < len;++ i) Add (a[i],b[i]);
  67. return a;
  68. }
  69. poly operator - (poly a,poly b){
  70. int len = max (SZ(a),SZ(b));
  71. a.resize (len),b.resize (len);
  72. for (Int i = 0;i < len;++ i) Sub (a[i],b[i]);
  73. return a;
  74. }
  75. poly operator + (poly a,int b){
  76. Add (a[0],b);
  77. return a;
  78. }
  79. poly operator - (poly a,int b){
  80. Sub (a[0],b);
  81. return a;
  82. }
  83. poly f;
  84. poly inv (poly &A,int n){
  85. if (n == 1) return poly (1,qkpow (A[0],mod - 2));
  86. poly Now,G0 = inv (A,(n + 1) >> 1);Now.resize (n);
  87. for (Int i = 0;i < n;++ i)
  88. if (i < SZ(A)) Now[i] = A[i];
  89. else Now[i] = 0;
  90. poly res = G0 * 2 - G0 * Now * G0;res.resize (n);
  91. return res;
  92. }
  93. poly inv (poly A){return inv (A,SZ(A));}
  94. poly der (poly A){
  95. for (Int i = 1;i < SZ(A);++ i) A[i - 1] = mul (A[i],i);
  96. A.pop_back ();
  97. return A;
  98. }
  99. int getinv (int x){return mul (ifac[x],fac[x - 1]);}
  100. poly inter (poly A){
  101. A.push_back (0);
  102. for (Int i = SZ(A) - 2;~i;-- i) A[i + 1] = mul (A[i],getinv (i + 1));
  103. A[0] = 0;
  104. return A;
  105. }
  106. poly ln (poly a,int n){
  107. poly res = inter (inv (a,n) * der (a));
  108. res.resize (n);
  109. return res;
  110. }
  111. poly ln (poly a){return ln (a,SZ(a));}
  112. void putout (poly a){
  113. cout << SZ(a) << ": ";for (Int i = 0;i < SZ(a);++ i) cout << a[i] << " ";cout << endl;
  114. }
  115. poly exp (poly &a,int n){
  116. if (n == 1) return poly (1,1);
  117. poly Now,G0 = exp (a,(n + 1) >> 1);Now.resize (n);
  118. for (Int i = 0;i < n;++ i) Now[i] = a[i];
  119. poly res = G0 - G0 * (ln(G0,n) - Now);res.resize (n);
  120. return res;
  121. }
  122. poly exp (poly a){return exp (a,SZ(a));}
  123. int n,m,k,e[MAXN],p[MAXN];
  124. void Work (){
  125. n = 1;
  126. for (Int i = 1;i <= m;++ i) read (p[i],e[i]),n += e[i];
  127. poly F,G;F.resize (n + 1),G.resize (n + 1);
  128. for (Int i = 1;i <= n;++ i){
  129. int tmp = 1;
  130. for (Int k = 1;k <= m;++ k) tmp = mul (tmp,binom (e[k] + i - 1,i - 1));
  131. G[i] = mul (ifac[i],tmp);
  132. }
  133. for (Int i = 0;i <= n;++ i) F[i] = mul (ifac[i],i & 1 ? mod - 1 : 1);
  134. // for (Int i = 0;i < SZ(F);++ i) cout << mul (fac[i],F[i]) << " ";cout << endl;
  135. // for (Int i = 0;i < SZ(G);++ i) cout << mul (fac[i],G[i]) << " ";cout << endl;
  136. F = F * G;
  137. for (Int i = 0;i < SZ(F);++ i) F[i] = mul (F[i],fac[i]);
  138. // for (Int i = 0;i < SZ(F);++ i) cout << F[i] << " ";cout << endl;
  139. // cout << n << endl;
  140. for (Int i = 1;i <= k;++ i){
  141. int res = 0;
  142. for (Int h = 0;h < n;++ h)
  143. // cout << i << " , " << h << ": " << mul (qkpow (F[h + 1],i - 1),qkpow (F[h],k - i + 1)) << endl,
  144. Add (res,mul (qkpow (F[h + 1],i - 1),qkpow (F[h],k - i + 1)));
  145. write (res),putchar (' ');
  146. }
  147. putchar ('\n');
  148. }
  149. signed main(){
  150. init_ntt ();
  151. fac[0] = 1;for (Int i = 1;i <= up;++ i) fac[i] = mul (fac[i - 1],i);
  152. ifac[up] = qkpow (fac[up],mod - 2);for (Int i = up;i;-- i) ifac[i - 1] = mul (ifac[i],i);
  153. int tot = 0;while (~scanf ("%d%d",&m,&k)) printf ("Case #%d: ",++ tot),Work ();
  154. return 0;
  155. }

题解 Division Game的更多相关文章

  1. 【题解】HDU5845 Best Division (trie树)

    [题解]HDU5845 Best Division (trie树) 题意:给定你一个序列(三个参数来根),然后请你划分子段.在每段子段长度小于等于\(L\)且子段的异或和\(\le x\)的情况下最大 ...

  2. Large Division(大数)题解

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...

  3. HDU3480:Division——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3480 将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值. 简单的d ...

  4. December Challenge 2019 Division 1 题解

    传送门 当我打开比赛界面的时候所有题目都已经被一血了-- BINXOR 直接把异或之后二进制最多和最少能有多少个\(1\)算出来,在这个范围内枚举,组合数算一下就行了.注意\(1\)的个数是\(2\) ...

  5. CodeChef November Challenge 2019 Division 1题解

    传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...

  6. Codechef July Challenge 2019 Division 1题解

    题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...

  7. CF1444A (1445C)Division 题解

    题意:求最大的正整数 \(x\) ,使 \(x \mid p且q \nmid x\) . 首先,当 \(q \nmid p\) ,显然取 \(x=p\) 是最优解. 现在,我们考虑 \(q \mid ...

  8. Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 D题题解

    将题意转换为一开始\(t = 0\),第\(i\)个操作是令\(t \leftarrow (a_i + 1) t + (a_i + b_i + 1)\).记\(A_i = a_i + 1, B_i = ...

  9. Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 C题题解

    首先,我们将题目理解成若\(i\)与\(j\)距离恰好为\(3\),则不可能\(p_i \equiv p_j \equiv 1 \space or \space 2 (\bmod 3)\).这就相当于 ...

随机推荐

  1. CSS截取字段,让过长的字段结尾变成省略号(IE有效)

    text-overflow:ellipsis;overflow:hidden;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transiti ...

  2. Elasticsearch集群搭建教程及生产环境配置

    Elasticsearch 是一个极其强大的搜索和分析引擎,其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性. 本教程将提供有关如何设置 Elasticsearch 集群的一些信息,并将添加一 ...

  3. Python3-sqlalchemy-orm 查询、修改

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  4. ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)

    只需执行 /Applications/Python\ 3.9/Install\ Certificates.command

  5. Django分页组件——Paginator

    from django.core.paginator import Paginator #导入Paginator objects = ['john','paul','george','ringo',' ...

  6. Mysql常用sql语句(3)- select 查询语句基础使用

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 针对数据表里面的每条记录,select查询语句叫 ...

  7. DHCP的原理和配置

    前言 在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数.如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网络参数,还有可能会造成 IP地址冲突等问题.使用动态主机配置协议DHC ...

  8. 再谈java线程

    线程状态 描述 当线程被创建并启动之后,它既不是已启动就进入到了执行状态,也不是一直处于执行状态.在线程的声明周期中有六中状态. java api中java.lang.Thread.State这个枚举 ...

  9. 在EXCEL中批量添加超链接

    在单元格中输入函数 =HYPERLINK(链接位置,[显示文本])

  10. HiveServer2的负载均衡高可用与ActicePassive高可用浅析

    负载均衡的高可用 最近在工作中遇到了hiveserver2需要部署高可用的场景,去网上搜索了解过后,用了绝大多数人推荐的共同方法: Property_name Property_value Descr ...