清北学堂模拟赛2 T2 ball
题目大意:
多组数据,每组给定n,m,表示将n个小球放进m个箱子,每个小球均有两个箱子(可能相同)可放,求所有小球均放好的方案mod998244353的总数。
思路:
算是我和题解思路肥肠相近的一道题可是还是惨遭爆零
考虑将箱子视为点,小球视为边,每一个小球的合法去向连一条无向边,则问题转化为使给定无向图的每一个点赋上一个与边的编号相同的值,使得每条边都有且只有一个相邻点的值与之相同。
对于不同连通块,ans直接相乘
对于点数小于边数的连通块(也即是自己思路中“环套环”的部分),无法分配,ans直接为0
对于边数等于点数的连通块,可以发现是一个环(基环树),此时除非环的长度为1(自己连自己),ans=1,否则ans=2(有顺时针和逆时针两种分配方式)
对于边数等于点数-1的连通块,可以发现是一棵树,ans=连通块中的点数
证明:对于仅有一个点的树(其实是个孤独的点),显然ans=1.
如果对上述的有k个节点的树(或者是个孤独的点)增加一个点并连一条边,显然可以给新边赋值为新点的权值,ans=k;
也可以给新边赋值给树上点的权值,此时染色方案被唯一确定,ans=1;
故ans=k+1,也为点数,得证。
直接DFS遍历所有连通块即可,一组数据的复杂度为O(n)。
代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define int long long
using namespace std;
const int mod=;
const int maxn=; struct node{
int to,next;
bool vis;
}e[maxn<<];
int head[maxn<<];
int cnt; inline void add(int u,int v) {
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
} int num_p,num_e;
bool isselfcir;
bool vis[maxn];
inline void dfs(int now) {
vis[now]=;
num_p++;
for (int i=head[now];i;i=e[i].next) {
int to=e[i].to;
if (!e[i].vis) e[i].vis=,num_e++;
if (to==now) isselfcir=;
if (vis[to]) continue;
dfs(to);
}
} signed main() {
int T;
scanf("%lld",&T);
while (T--) {
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));
memset(e,,sizeof(e));
cnt=;
int n,m;
scanf("%lld%lld",&m,&n);
for (int i=;i<=m;i++) {
int x,y;
scanf("%lld%lld",&x,&y);
add(x,y),add(y,x);
}
int ans=;
for (int i=;i<=n;i++) {
if (!vis[i]) {
isselfcir=,num_p=,num_e=;
dfs(i);
num_e>>=;
if (num_e>num_p) {
ans=;
break;
}
if (num_e==num_p)
if (!isselfcir) ans*=,ans%=mod;
if (num_e==num_p-)
ans*=num_p,ans%=mod;
}
}
printf("%lld\n",ans);
}
}
清北学堂模拟赛2 T2 ball的更多相关文章
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d6t4 数组异或
分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...
- 清北学堂模拟赛d2t6 分糖果(candy)
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...
随机推荐
- 设计模式01 创建型模式 - 原型模式(Protype Pattern)
参考 1. 设计模式:原型模式 | 博客园 2. Java clone深拷贝.浅拷贝 | CSDN 3. Cloneable接口和Object的clone()方法 | 博客园 原型模式(Prototy ...
- 对于使用javaweb技术制作简单管理系统的学习
近期在老师的引导下我们学习了利用Javaweb技术制作简单的管理系统,其中涉及到的技术很多,由于大多都是自学 对这些技术的理解还太浅显但能实现一些相关功能的雏形. (一).登录功能 在登陆功能中通过与 ...
- 新手如何配置 Chromedriver 环境变量
有一个不错的链接:https://blog.csdn.net/qq_41429288/article/details/80472064
- day4-1深入理解对象之创建对象
深入理解对象 之创建对象: 工厂模式: 工厂模式虽然解决了创建\多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型) 工厂模式问题:那就是识别问题,因为根本无法 搞清楚他们到底是 ...
- gitignore文件简单编写规则
一.生成.gitignore文件 1.进入项目根目录,打开终端: 2.输入 vi .gitignore 创建并打开隐藏文件.gitignore: 二 . 设置要忽略上传的文件或文件夹 1.过滤整个文件 ...
- Vue中 关于 ‘...mapGetters’的了解
首先,我们应该知道getters是vuex中的特殊表达部分 不使用map辅助函数: computed: { test:()=> this.$store.getters.doSome } 使用ma ...
- Linux命令:vi | vim命令
vim - vi 增强版.文本编辑器 格式:vim [options] [file ..] 说明:如果file存在,文件被打开并显示内容,如果文件不存在,当编辑后第一次存盘时创建它 [options] ...
- 移动端禁止缩放<meta>
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale= ...
- 「Violet」蒲公英
「Violet」蒲公英 传送门 区间众数,强制在线. 分块经典题. 像这题一样预处理,然后就直接爆搞,复杂度 \(O(n \sqrt n)\) 参考代码: #include <algorithm ...
- uniGUI之多页面框架(16)
效果图: 左边的树 的树结点 ,通过 结点名 与 右 侧TabSheet名 一致时,显示 相关页面. 这是相关 源代码 procedure TMainForm.UniFormCreate(Sender ...