题目背景

我的母亲柯蒂丽亚,是一个舞者。身披罗纱,一身异国装扮的她,来自灰狼的村子。

曾经在灰狼村子担任女侍的她,被认定在某晚犯下可怕的罪行之后,被赶出了村子。

一切的元凶,都要回到母亲犯下重罪的那一晚。

题目描述

我不认为柯蒂丽亚有犯罪。

二十年前的混沌,一共有n块碎片。

这n块碎片曾经两两之间都有联系,可是很多联系都在时间的洪流中消失了。

现在,我只能确定其中m条联系的种类。

每条联系都是一条无向边,任意两块碎片之间至多有一条联系,没有联系会连接在同一块碎片的两端。

联系有两种。一种是冲突,用0表示;另一种是吻合,用1表示。

虽然已经过去了二十年,但是联系的种类是不会变的。

现在,我想要用这m条联系,去推断二十年前的n(n-1)/2条联系的种类。

如果我推理出所有联系的种类,那么我就可以将混沌言语化,证明柯蒂丽亚的清白。

在灰狼的村子,我得知了推理的唯一条件:

二十年前,对于任意三块互不相同的碎片,要么这三块碎片两两吻合,要么恰好有一对碎片互相吻合。

我想要知道,二十年前n块碎片两两之间的联系,可能有多少种。

你只要输出方案数模998244353之后的结果。如果已经确定的m条联系不符合上述条件,请输出0。

两种方案不同,当且仅当存在两块碎片,在一种方案中冲突,在另一种方案中吻合。也就是说,你要求的是有多少种可能的原图。

【输入描述】

第一行两个整数Test,T,Test表示测试点的编号,T表示数据的组数。保证T≤3。

接下来T组数据,每组数据第一行两个整数n,m,

接下来m行,每行三个整数u,v,t,表示第u块碎片和第v块碎片之间联系的种类为t。

【输出描述】

共T行,每行一个整数,表示方案数对998244353取模后的结果。

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

  1. 0 2
  2. 3 0
  3. 4 2
  4. 1 2 1
  5. 1 3 0
输出样例#1:

  1. 4
  2. 2

说明

n <= 10^5

m <= 10^6

分析:考虑这样一个图:,把一个连通块分成AB两部分,其中A和B两个不同的集合中每两个点都是吻合的,A集合的点到B集合的点之间每两个点都是冲突的.这样你任取三个点都是满足要求的.然后我们新加一个连通块:,连线的代表都是冲突的,圆圈里的是吻合的,这是一种合法的方案,我们把CD交换一下,得到的又是一种新的方案,然后这两个连通块又可以合并成一个连通块.n个连通块有2*(n-1)条边连接,每两条边可以互换,这也就是说答案就是2^(cnt - 1),cnt为连通块个数。如果连通块退化成一个点也成立.

关于如何求连通块个数:有向图可以用tarjan缩点,无向图可以用并查集.

考场上犯了几个脑残错误:1.flag没有清零 2.快速幂传递的参数传成了int,大数据直接爆掉QAQ,结果只有10分.

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. const int mod = ;
  10.  
  11. int test, t, n, m, fa[];
  12. bool flag = false;
  13.  
  14. int find(int x)
  15. {
  16. if (x == fa[x])
  17. return x;
  18. return fa[x] = find(fa[x]);
  19. }
  20.  
  21. void hebing(int x, int y)
  22. {
  23. int fx = find(x), fy = find(y);
  24. if (fx != fy)
  25. fa[fy] = fx;
  26. }
  27.  
  28. long long qpow(long long a, long long n)
  29. {
  30. long long result = ;
  31. while (n) {
  32. if (n & ) result = (result*a) % mod;
  33. a = (a*a) % mod;
  34. n >>= ;
  35. }
  36. return result;
  37. }
  38.  
  39. int main()
  40. {
  41. scanf("%d%d", &test, &t);
  42. while (t--)
  43. {
  44. flag = ;
  45. scanf("%d%d", &n, &m);
  46. for (int i = ; i <= * n; i++)
  47. fa[i] = i;
  48. for (int i = ; i <= m; i++)
  49. {
  50. int u, v, tt;
  51. scanf("%d%d%d", &u, &v, &tt);
  52. if (tt == )
  53. {
  54. if (find(u + n) == find(v) || find(u) == find(v + n))
  55. flag = ;
  56. else
  57. {
  58. hebing(u, v);
  59. hebing(u + n, v + n);
  60. }
  61. }
  62. else
  63. {
  64. if (find(u) == find(v) || find(u + n) == find(v + n))
  65. flag = ;
  66. else
  67. {
  68. hebing(u + n, v);
  69. hebing(u, v + n);
  70. }
  71. }
  72. }
  73. if (flag)
  74. printf("0\n");
  75. else
  76. {
  77. int cnt = ;
  78. for (int i = ; i <= n; i++)
  79. if (fa[i] == i)
  80. cnt++;
  81. printf("%lld\n", qpow(, cnt - ));
  82. }
  83. }
  84.  
  85. return ;
  86. }

常州模拟赛d3t2 灰狼呼唤着同胞的更多相关文章

  1. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  2. 灰狼呼唤着同胞(brethren)

    先求出确定边的联通块,有cnt块,显然方案数为2^(cnt-1) 联通块用dfs很好求 但此题还有并查集解法,且与一道叫团伙的题很像 边为0为敌人,1为朋友,敌人的敌人是朋友,朋友的朋友是朋友,正好对 ...

  3. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

  4. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...

  5. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  6. 常州模拟赛d5t2 mogician

    分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...

  7. 常州模拟赛d5t1 journalist

    分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...

  8. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  9. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

随机推荐

  1. COFF文件格式

    链接器 目录 一 COFF-Common Object File Format-通用对象文件格式... 3 COFF的文件格式与结构体... 4 文件头... 5 numberOfSections(区 ...

  2. 在一个工程中同时使用Swift和Objective-C

    Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实 ...

  3. 如何移除 Navicat Premium for Mac 的所有文件

    作者:郭文峰链接:http://www.zhihu.com/question/24210959/answer/34579422来源:知乎著作权归作者所有,转载请联系作者获得授权. 数据库连接信息存放在 ...

  4. Bootstrap历练实例:禁用的按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  5. PWA天气应用

    https://codelabs.developers.google.com/codelabs/your-first-pwapp/#0 1.介绍 这里将使用PWA技术来构建一个天气web应用,这个ap ...

  6. perl学习之子例程

    1.system function  && user function system fucntion:chomp  reverse print... user function: & ...

  7. 【转发】【linux】【ftp】CentOS 7.0安装配置Vsftp服务器

    adduser -d /var/www/android -g ftp -s /sbin/nologin ftp2 一.配置防火墙,开启FTP服务器需要的端口 CentOS 7.0默认使用的是firew ...

  8. 【STL初步】不定长数组:vector + 集合:set + 映射:map

    一.vector 为了节省空间,有时我们会使用动态数组vector. 定义动态数组 vector<类型名>变量名 vector<int>que //定义que为一个int类型的 ...

  9. ACM训练联盟周赛 G. Teemo's convex polygon

    65536K   Teemo is very interested in convex polygon. There is a convex n-sides polygon, and Teemo co ...

  10. eclipse去除js(JavaScript)验证错误

    第一步: 去除eclipse的JS验证: 将windows->preference->Java Script->Validator->Errors/Warnings-> ...