题解

简单容斥题

至少选了\(k\)个颜色恰好出现\(S\)次方案数是

\(F[k] = \binom{M}{k} \frac{N!}{(S!)^{k}(N - i * S)!}(M - k)^{N - i * S}\)

然后恰好\(k\)个颜色恰好出现\(k\)次就是

\(g[k] = \sum_{j = k}^{M} (-1)^{k - j} \binom{j}{k}F[j]\)

然后就是

\(g[k]*k! = \sum_{j = k}^{M}\frac{(-1)^{j - k}}{(j - k)!} F[j]*j!\)

后面的只要把其中一个指数取反,就可以NTT卷积优化了

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define pdi pair<db,int>
  6. #define mp make_pair
  7. #define pb push_back
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. #define eps 1e-8
  11. #define MAXN 100005
  12. #define mo 974711
  13. //#define ivorysi
  14. using namespace std;
  15. typedef long long int64;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;char c = getchar();T f = 1;
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 + c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. const int MOD = 1004535809;
  39. const int MAXL = 1 << 20;
  40. int W[MAXL + 5],a[MAXN],N,M,S,F[MAXN];
  41. int fac[10000005],invfac[10000005];
  42. int f[1000005],g[1000005];
  43. int inc(int a,int b) {
  44. return a + b >= MOD ? a + b - MOD : a + b;
  45. }
  46. int mul(int a,int b) {
  47. return 1LL * a * b % MOD;
  48. }
  49. int C(int n,int m) {
  50. if(n < m) return 0;
  51. return mul(fac[n],mul(invfac[m],invfac[n - m]));
  52. }
  53. int fpow(int x,int c) {
  54. int res = 1,t = x;
  55. while(c) {
  56. if(c & 1) res = mul(res,t);
  57. t = mul(t,t);
  58. c >>= 1;
  59. }
  60. return res;
  61. }
  62. void NTT(int *p,int L,int on) {
  63. for(int i = 1 , j = L >> 1 ; i < L - 1 ; ++i) {
  64. if(i < j) swap(p[i],p[j]);
  65. int k = L >> 1;
  66. while(j >= k) {
  67. j -= k;
  68. k >>= 1;
  69. }
  70. j += k;
  71. }
  72. for(int h = 2 ; h <= L ; h <<= 1) {
  73. int wn = W[(MAXL + on * MAXL / h) % MAXL];
  74. for(int k = 0 ; k < L ; k += h) {
  75. int w = 1;
  76. for(int j = k ; j < k + h / 2 ; ++j) {
  77. int u = p[j],t = mul(w,p[j + h / 2]);
  78. p[j] = inc(u,t);
  79. p[j + h / 2] = inc(u,MOD - t);
  80. w = mul(w,wn);
  81. }
  82. }
  83. }
  84. if(on == -1) {
  85. int InvL = fpow(L,MOD - 2);
  86. for(int i = 0 ; i < L ; ++i) p[i] = mul(InvL,p[i]);
  87. }
  88. }
  89. void Solve() {
  90. read(N);read(M);read(S);
  91. for(int i = 0 ; i <= M ; ++i) read(a[i]);
  92. fac[0] = 1;
  93. for(int i = 1 ; i <= 10000000 ; ++i) fac[i] = mul(fac[i - 1],i);
  94. invfac[10000000] = fpow(fac[10000000],MOD - 2);
  95. for(int i = 10000000 - 1 ; i >= 0 ; --i) invfac[i] = mul(invfac[i + 1],i + 1);
  96. W[0] = 1;
  97. W[1] = fpow(3,(MOD - 1) / MAXL);
  98. for(int i = 2 ; i < MAXL ; ++i) W[i] = mul(W[i - 1],W[1]);
  99. int t = 1;
  100. for(int i = 0 ; i <= M ; ++i) {
  101. if(N / S < i) break;
  102. F[i] = mul(C(M,i) , mul(fac[N] , mul(t , invfac[N - i * S])));
  103. F[i] = mul(F[i],fpow(M - i,N - i * S));
  104. t = mul(t,invfac[S]);
  105. }
  106. for(int i = 0 ; i <= M ; ++i) f[i] = mul(F[i],fac[i]);
  107. t = 1;
  108. for(int i = 0 ; i <= M ; ++i) {
  109. g[M - i] = mul(t,invfac[i]);
  110. t = mul(t,MOD - 1);
  111. }
  112. t = 1;
  113. while(t <= 2 * M) t <<= 1;
  114. NTT(f,t,1);NTT(g,t,1);
  115. for(int i = 0 ; i < t ; ++i) g[i] = mul(g[i],f[i]);
  116. NTT(g,t,-1);
  117. int ans = 0;
  118. for(int i = 0 ; i <= M ; ++i) {
  119. g[i + M] = mul(g[i + M],invfac[i]);
  120. ans = inc(ans,mul(g[i + M],a[i]));
  121. }
  122. out(ans);enter;
  123. }
  124. int main() {
  125. #ifdef ivorysi
  126. freopen("f1.in","r",stdin);
  127. #endif
  128. Solve();
  129. }

【LOJ】#2527. 「HAOI2018」染色的更多相关文章

  1. 「HAOI2018」染色 解题报告

    「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...

  2. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  3. LOJ #2527 Luogu P4491「HAOI2018」染色

    好像网上没人....和我推出....同一个式子啊..... LOJ #2527 Luogu P4491 题意 $ n$个格子中每个格子可以涂$ m$种颜色中的一种 若有$ k$种颜色恰好涂了$ s$格 ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. 【题解】 [ZJOI2006]书架 (Splay)

    懒得复制,戳我戳我 Solution: 还是一个\(Splay\),我们只用多存一个值\(rad\)来维护二叉树,然后用数组存下每个书对应的值是多少 \(Top\)操作,我是把\(s\)旋转到根节点, ...

  2. 【题解】 Test 买水的ACX(套路)

    题目描述: ACX在××信竞组学会信息竞赛,但是他的同学都很巨,于是要他去买水,结果来到某个买水的商店(奇奇怪怪的商店). 一天,ACX买了 N 个容量可以认为是无限大的瓶子,初始时每个瓶子里有 1  ...

  3. 洛谷 P2245 星际导航 解题报告

    P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ...

  4. Windowd系统下Eclipse CDT+MinGW快速搭建C/C++开发环境

    安装MinGW后,最简单的配置:Window -> Preferences -> C/C++ -> Build -> Environment添加Path : $PATH;D:\ ...

  5. vue实例的方法

    1.mount挂载 vm.$mount('#app') 2.销毁 vm.$destroy() 3.刷新实例 vm.$forceUpdate() 4.更新后的操作 vm.$nextTick(functi ...

  6. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  7. 如何使用 grunt

    1>. 首先要有nodejs环境, 至少0.8.0版本: 2>. 转到 项目文件夹下: >npm install –g grunt-cli >npm init #生成一个基本的 ...

  8. 20155306 2016-2017-2 《Java程序设计》第5周学习总结

    20155306 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 8.1 语法与继承架构 Java中所有错误都会被打包为对象,运用try.c ...

  9. json转化数组

    //json格式数据 $data = '[{ "F_ModuleId": "1", "F_ParentId": "0", ...

  10. iframe引入网页

    <!DOCTYPE html> <html> <body> <iframe src="/example/html/demo_iframe.html& ...