这次组队赛又被锤了,和队友开题过了签到,然后就没有了,这题其实我看懂了点,就有了思路,但是无奈我不会求环的周长,印象中F - Forest Program 加反思_i++求无向图的连通分量可以,也没问队友就去照着模板抄了抄,写了两个小时写崩了,因为题意也没看太懂,给队友随便口胡了一个题意,队友就开始敲那个假题意的算法了,敲完后,题目怎么也过不去,最后发现看题,看错题,敲那个代码完全没用,赛后,问另一个队友,他说他会dfs求几个环的点,带环的周长。我为什么没有和好好交流这题呢。按理说,这题如果好好交流,并且好好看题,一个小时以内就能出,剩下4个小时,三个人好好开一题,应该还能开出来。

反思:
重要的话说四遍:
1:看题!看题!看题!看题! 哪怕三人用半个小时看题,再也不没搞清思路,就开始胡敲
2:一定要和队友交流,如果无法实现代码,一定要和队友好好交流,直到思路清晰,可以实现,感觉问题不大,再开始敲代码
3:不要乱开题,跟榜,跟榜,即使感觉可以写,但榜单上过的人很少,就果断放弃,去写大部分人没写的!
4:稳定心态,稳定心态,太急了,分题去写我们队暂时不具备这样的能力,最多分出一个人去写,剩下两个人一定要一起写。

参考代码:

/*
* @Author: vain
* @Date: 2020
* @LastEditTime: 2020-10-04 21:04:16
* @LastEditors: sueRimn
* @Description: 学不会 dp 的 fw
* @FilePath: \main\demo.cpp
*/
//#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include <bitset>
using namespace std;
typedef long long ll;
#define
//typedef unsigned long long uint;
const int N = 5000 + 20;
const int maxn = 5e5 + 20;
const int mod = 998244353;
ll in[maxn], cnt, head[maxn];
typedef pair<ll, ll> p;
//priority_queue<p, vector<p>, greater<p>> q;
//int sum[maxn];
double Max(double a, double b) { return a > b ? a : b; }
int min(int a, int b) { return a < b ? a : b; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a * b / gcd(a, b); }
void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; }
int lowbit(int x) { return (x) & (-x); }
map<int, int> mp;
ll ksm(ll a, ll b)
{
ll res = 1;
for (; b;)
{
if (b & 1)
res = (res * a) % mod;
b >>= 1, a = a * a % mod;
}
return res;
}
int read(int &v)
{
int k = 1;
v = 0;
int c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
k = 0;
c = getchar();
}
while (c >= '0' && c <= '9')
v = (v << 3) + (v << 1) + (c - 48), c = getchar();
if (k == 0)
v = -v;
return c;
}
vector<int> f[maxn];
int k, tim, top, rt;
struct node
{
int v, nex;
} edge[maxn];
int low[maxn], dfn[maxn], stac[maxn];
void add(int u, int v)
{
edge[cnt].v = v, edge[cnt].nex = head[u];
head[u] = cnt++;
}
int vis[maxn], depth[maxn], v[maxn], len;
void dfs(ll x, ll fa)
{
for (ll i = head[x]; ~i; i=edge[i].nex)
{
ll y = edge[i].v;
if (fa == y)
continue;
if (vis[y] && depth[x] - depth[y] > 1)
{
v[len++] = depth[x] - depth[y] + 1;
}
else if (vis[y] == 0)
{
vis[y] = 1;
depth[y] = depth[x] + 1;
dfs(y, x);
}
}
}
int main()
{
int n, m;
read(n), read(m);
for (int i = 1; i <= n; i++)
head[i] = -1;
for (int i = 1; i <= m; i++)
{
int u, v;
read(u), read(v);
add(u, v), add(v, u);
}
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
vis[i] = depth[i] = 1;
dfs(i, 0);
}
}
int res = 0;
ll ans = 1;
for (int i = 0; i < len; i++)
{
ans = (ans * (ksm(2, v[i]) - 1 + mod) % mod) % mod;
res += v[i];
}
ans = (ans * ksm(2, m - res)) % mod;
printf("%lld\n", ans);
}