题解

学习一个全世界人都会只有我不会的东西

子集变换!

难道我要把这题当板子讲?等等这题好像是板。。。WC出板题好刺激啊= =

假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或卷积的理论(似乎FMT本质就是FWT的或卷积方式)

子集变换是什么呢,就是把FMT带一个多项式

什么意思呢,就是我们需要

\(h_{S} = \sum_{T \subseteq S} g_{T}f_{S - T}\)

算h,怎么算,显然或卷积不成立啊,因为可能有交集

那么考虑到\(|S| + |S - T| = |S|\)绝对值符号指元素个数,也就是1的个数

我们就……套上一个多项式!

\(g_{T}x^{|T|}\)的\(g_{T}\)是有值的

这样我们对每个N都做一遍FMT,相乘之后做一遍IFMT,我们需要的就是\(h_{S}x^{|S|}\)

那么……我们再来看这道题

显然就是

\(dp_{S} = \frac{1}{g_{S}}\sum_{T \subseteq S}g_{T}dp_{S - T}\)

g就是集合里人数的总和的p次方

啥,自己和自己卷积……

我们处理的时候从dp[1 - N][S]开始处理,就是每次算好每一层的dp值,还原回来乘上前面的系数,再FMT回去

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <vector>
  8. //#define ivorysi
  9. #define MAXN 100005
  10. #define eps 1e-7
  11. #define mo 974711
  12. #define pb push_back
  13. #define mp make_pair
  14. using namespace std;
  15. typedef long long int64;
  16. typedef unsigned int u32;
  17. typedef double db;
  18. const int64 MOD = 998244353;
  19. int N,M,p;
  20. int g[25][25],ind[25],cnt[1 << 21],w[25],fa[25];
  21. int64 F[23][1 << 21],inv[1 << 21],dp[23][1 << 21];
  22. bool vis[25];
  23. int getfa(int x) {
  24. return fa[x] == x ? x : fa[x] = getfa(fa[x]);
  25. }
  26. int64 fpow(int64 x,int64 c) {
  27. int64 res = 1,t = x;
  28. while(c) {
  29. if(c & 1) res = res * t % MOD;
  30. t = t * t % MOD;
  31. c >>= 1;
  32. }
  33. return res;
  34. }
  35. int64 calc(int64 v) {
  36. if(p == 0) return 1;
  37. else if(p == 1) return v;
  38. else return v * v % MOD;
  39. }
  40. void FMT(int64 *a,int64 ty) {
  41. for(int i = 1 ; i < (1 << N) ; i <<= 1) {
  42. for(int j = 0 ; j < (1 << N) ; ++j) {
  43. if(j & i) a[j] = (a[j] + ty * a[j ^ i] + MOD) % MOD;
  44. }
  45. }
  46. }
  47. void Init() {
  48. scanf("%d%d%d",&N,&M,&p);
  49. int u,v;
  50. for(int i = 1 ; i <= M ; ++i) {
  51. scanf("%d%d",&u,&v);
  52. g[u][v] = g[v][u] = 1;
  53. }
  54. for(int i = 1 ; i <= N ; ++i) scanf("%d",&w[i]);
  55. for(int i = 1 ; i < (1 << N) ; ++i) cnt[i] = cnt[i - (i & -i)] + 1;
  56. for(int S = 1 ; S < (1 << N) ; ++S) {
  57. memset(vis,0,sizeof(vis));
  58. memset(ind,0,sizeof(ind));
  59. int sum = 0,v = 0;
  60. for(int i = 1 ; i <= N ; ++i) {
  61. fa[i] = i;
  62. if((S >> i - 1) & 1) {
  63. vis[i] = 1,sum += w[i];
  64. if(v == 0) v = i;
  65. }
  66. }
  67. for(int i = 1 ; i <= N ; ++i) {
  68. if(!vis[i]) continue;
  69. for(int j = i + 1 ; j <= N ; ++j) {
  70. if(!vis[j]) continue;
  71. if(g[i][j] == 1) {
  72. fa[getfa(i)] = getfa(j);
  73. ++ind[i];++ind[j];
  74. }
  75. }
  76. }
  77. bool flag = 1;
  78. for(int i = 1 ; i <= N ; ++i) {
  79. if(vis[i]) {
  80. if(ind[i] & 1) {flag = 0;break;}
  81. if(getfa(v) != getfa(i)) {flag = 0;break;}
  82. }
  83. }
  84. F[cnt[S]][S] = (flag ^ 1) * calc(sum);
  85. inv[S] = fpow(calc(sum),MOD - 2);
  86. }
  87. }
  88. void Solve() {
  89. for(int i = 1 ; i <= N ; ++i) FMT(F[i],1);
  90. dp[0][0] = 1;
  91. FMT(dp[0],1);
  92. for(int i = 1 ; i <= N ; ++i) {
  93. for(int j = 1 ; j <= i ; ++j) {
  94. for(int S = 0 ; S < (1 << N) ; ++S) {
  95. (dp[i][S] += dp[i - j][S] * F[j][S]) %= MOD;
  96. }
  97. }
  98. FMT(dp[i],-1);
  99. for(int S = 0 ; S < (1 << N) ; ++S) dp[i][S] = dp[i][S] * inv[S] % MOD;
  100. FMT(dp[i],1);
  101. }
  102. FMT(dp[N],-1);
  103. printf("%lld\n",dp[N][(1 << N) - 1]);
  104. }
  105. int main() {
  106. #ifdef ivorysi
  107. freopen("f1.in","r",stdin);
  108. #endif
  109. Init();
  110. Solve();
  111. }

【LOJ】#2340. 「WC2018」州区划分的更多相关文章

  1. loj#2340. 「WC2018」州区划分

    FWT&&FMT板子 #include<cstdio> #include<iostream> #include<cstring> #include& ...

  2. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  3. LOJ 2339 「WC2018」通道——边分治+虚树

    题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...

  4. @loj - 2339@ 「WC2018」通道

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...

  5. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  6. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  7. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  8. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

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

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

随机推荐

  1. Window10+Python3.5安装opencv

    Window10+Python3.5安装opencv 标签: opencvpython 2017-05-14 16:47 2201人阅读 评论(0) 收藏 举报  分类: Python编程(41)  ...

  2. day7 方法及基础知识运用

    做了一个小型的成绩管理系统.主要代码如下: /* * 功能:简易学生成绩管理系统 */package day7; import java.util.Scanner; public class Home ...

  3. java web实现计划定时任务

    java web实现定时计划任务 1.定义一个类继承TimerTask,在run方法中写上需要执行的逻辑 package com.mytask; import java.util.TimerTask; ...

  4. linux split 切割大文件

    语法: split  [-l <行数>] [-b <字节>] [-C <字节>] [要切割的目标文件] [输出文件名前缀] 说明: -l <行数> 指定 ...

  5. iOS设备分辨率

    CHENYILONG Blog iOS设备分辨率 © chenyilong. Powered by Postach.io Blog

  6. seq与Shell序列生成

    有时候可能有这样的需要:用Shell生成类似0001这样的序列作为批次号,这里整理了一下个人的方法 方法一:通过seq命令 seq命令可以生成从某个数字到递增到另一数字的序列.用法如下: # seq ...

  7. POJ 2485 Highways( 最小生成树)

    题目链接 Description The islandnation of Flatopia is perfectly flat. Unfortunately, Flatopia has no publ ...

  8. Android手动回收bitmap,引发Canvas: trying to use a recycled bitmap处理

    在做Android的开发的时候,在ListView 或是 GridView中需要加载大量的图片,为了避免加载过多的图片引起OutOfMemory错误,设置了一个图片缓存列表 Map<String ...

  9. css给表格每一列设置不同的样式

    第一列#id table tr td:first-child{ overflow: visible; }第二列table tr td:first-child+td{color:#666;}第三列tab ...

  10. 【技巧总结】Penetration Test Engineer[1]-Basic

    1.渗透测试基础 1.1.渗透测试分类 黑盒测试:从远程网络位置来评估目标网络基础设施,没有任何相关信息 白盒测试:内部发起,了解到关于目标环境的所有内部与底层知识 灰盒测试:结合两者优势,根据对目标 ...