题解

如果一个联通块是一个树的话,方案数就一种,如果这个联通块还有别的边,那选了一条别的边就会把树上对应路径全部取反,所以方案数是\(2^{m - n + 1}\)

如果联通块数为\(c\)方案数为\(2^{m - m + c}\)

一个联通块有奇数个黑点一定为0

然后就对于每个点判断是不是割点,是的话看看分成的联通块有几个包含奇数个黑点

然后如果不是割点看看删掉这个点后联通块黑点个数的奇偶性改没改变

同时要特判联通块里只有一个点的情况

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define MAXN 100005
#define mo 974711
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int N,M,pw[200005];
char s[MAXN];
struct node {
int to,next;
}E[MAXN * 2];
int head[MAXN],sumE,conn,deg[MAXN],rec[MAXN],incodd[MAXN],incconn[MAXN];
int dfn[MAXN],low[MAXN],idx,sta[MAXN],top,siz[MAXN],black,odd;
bool cut[MAXN],vis[MAXN],acs[MAXN];
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void Tarjan(int u,int fa) {
int son = 0;
low[u] = dfn[u] = ++idx;
sta[++top] = u;
siz[u] = (s[u] == '1');
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa) {
if(dfn[v]) low[u] = min(low[u],dfn[v]);
else {
Tarjan(v,u);
if(low[v] >= dfn[u]) {
++son;
if(fa) cut[u] = 1;
int t = 0;
while(1) {
int x = sta[top--];
t += siz[x];
if(x == v) break;
}
incodd[u] += (t & 1);
incconn[u]++;
siz[u] += t;
}
low[u] = min(low[v],low[u]);
}
}
}
if(!fa && son > 1) cut[u] = 1;
if(cut[u]) {
if(fa) incconn[u]++;
incodd[u] += (black - siz[u] & 1);
if(odd - (black & 1) + incodd[u] == 0) acs[u] = 1;
}
else {
if(odd - (black & 1) + (black - (s[u] == '1') & 1) == 0) acs[u] = 1; }
}
void dfs(int u) {
vis[u] = 1;
if(s[u] == '1') ++black;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) dfs(v);
}
}
void Init() {
read(N);read(M);
memset(head,0,sizeof(head));sumE = 0;
memset(deg,0,sizeof(deg));
idx = 0;top = 0;conn = 0;
memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
memset(siz,0,sizeof(siz));
memset(cut,0,sizeof(cut));memset(vis,0,sizeof(vis));
memset(acs,0,sizeof(acs));
memset(incodd,0,sizeof(incodd));memset(incconn,0,sizeof(incconn));
int u,v;
for(int i = 1 ; i <= M ; ++i) {
read(u);read(v);
add(u,v);add(v,u);
deg[u]++;deg[v]++;
}
scanf("%s",s + 1);
odd = 0;
for(int i = 1 ; i <= N ; ++i) {
if(!vis[i]) {
black = 0;
++conn;
dfs(i);
rec[i] = black;
if(black & 1)++odd;
}
}
}
void Solve() {
if(odd >= 2) {
for(int i = 1 ; i <= N + 1 ; ++i) {out(0);space;}
return;
}
for(int i = 1 ; i <= N ; ++i) {
if(!dfn[i]) {
top = 0;idx = 0;
black = rec[i];
Tarjan(i,0);
if(!deg[i]) cut[i] = 1;
}
}
if(odd == 0) {
out(pw[M - N + conn]);space;
}
else {
out(0);space;
}
for(int i = 1 ; i <= N ; ++i) {
if(!acs[i]) out(0);
else if(cut[i]) {
out(pw[(M - deg[i]) - (N - 1) - 1 + conn + incconn[i]]);
}
else {
out(pw[(M - deg[i]) - (N - 1) + conn]);
}
space;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
pw[0] = 1;
for(int i = 1 ; i <= 200000; ++i) {
pw[i] = mul(pw[i - 1],2);
}
int T;
read(T);
while(T--) {Init();Solve();enter;}
}

【LOJ】#2524. 「HAOI2018」反色游戏的更多相关文章

  1. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  2. loj#2269. 「SDOI2017」切树游戏

    还是loj的机子快啊... 普通的DP不难想到,设F[i][zt]为带上根玩出zt的方案数,G[i][zt]为子树中的方案数,后面是可以用FWT优化的 主要是复习了下动态DP #include< ...

  3. LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积

    题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...

  4. loj#6436. 「PKUSC2018」神仙的游戏(生成函数)

    题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...

  5. LOJ #6436. 「PKUSC2018」神仙的游戏

    题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...

  6. loj#6436. 「PKUSC2018」神仙的游戏(NTT)

    题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(le ...

  7. 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)

    题目传送门:loj bzoj 题意中的游戏方案可以转化为一个异或方程组的解,将边作为变量,点作为方程,因此若方程有解,方程的解的方案数就是2的自由元个数次方.我们观察一下方程,就可以发现自由元数量=边 ...

  8. 【BZOJ5303】[HAOI2018]反色游戏(Tarjan,线性基)

    [BZOJ5303][HAOI2018]反色游戏(Tarjan,线性基) 题面 BZOJ 洛谷 题解 把所有点全部看成一个\(01\)串,那么每次选择一条边意味着在这个\(01\)串的基础上异或上一个 ...

  9. bzoj 5393 [HAOI2018] 反色游戏

    bzoj 5393 [HAOI2018] 反色游戏 Link Solution 最简单的性质:如果一个连通块黑点个数是奇数个,那么就是零(每次只能改变 \(0/2\) 个黑点) 所以我们只考虑偶数个黑 ...

随机推荐

  1. 【洛谷P2504】聪明的猴子 最小瓶颈树

    题目大意:给定一张 N 个顶点的完全图,边有边权,求该完全图的一棵最小瓶颈树. 最小瓶颈树:一棵最大边权值在同一张图的所有生成树中最小,即:最大边权值最小的生成树,其值为该树的最大边权的权值. 引理1 ...

  2. C++代理模式

    主要根据代理模式整理,感谢作者分享! [DP]上的定义:为其他对象提供一种代理以控制对这个对象的访问.有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用.本文主要介绍虚代理 ...

  3. php错误日志

    php错误日志 /usr/local/php/var/log/php-fpm.log」—————————

  4. HDU 2509 基础Anti-SG NIM

    如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:(1)游戏的SG!=0 && 存在单一游戏的SG>1:(2)游戏的SG==0  && ...

  5. 流媒体技术学习笔记之(四)解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了

    源码地址:https://github.com/Tinywan/PHP_Experience 总结: 说明: 测试环境:本测试全部来自阿里云直播和OSS存储点播以及本地服务器直播和点播 播放器:Vid ...

  6. [iOS]深拷贝/浅拷贝区别

    来点鸡汤: // 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则: //   1. 改变原对象的属性和行为不会影响副本对象 //   2. 改变副本对象的属性和行为不会影响原对象 ...

  7. [转载]嵌入式C语言中的Doxygen注释模板

    http://blog.csdn.net/willerency/article/details/7083953 嵌入式C语言开发中通常使用Doxygen进行文档的生成.Doxygen支持多种格式,非常 ...

  8. 高品质的JavaScript

    整理书籍内容(QQ:283125476 发布者:M [重在分享,有建议请联系->QQ号]) 养成良好的编程习惯 ##如何避免团队JS冲突 * 避免实用全局变量[可使用匿名函数进行处理]以避免全局 ...

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

    20155328 2016-2017-2 <Java程序设计> 第8周学习总结 教材学习内容总结 NIO与NIO2 认识NIO 相对于IO,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣 ...

  10. 20155206 2016-2017-2 《Java程序设计》第6周学习总结

    20155206 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 串流设计 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的. Ja ...