清北学堂模拟赛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颗这样数量的糖果 ...
随机推荐
- 2019年mybatils面试高频题(java)
前前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季. 那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情. 当然,不论 ...
- 一文解读RISC与CISC (转)
RISC(精简指令集计算机)和CISC(复杂指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法. 早期的CPU全部是CISC架构,它的设计目的是要用最少的机器语言指令来完成 ...
- centOS+DJango+mysql_nginx部署流程记录
安装Python3.6.2: https://www.jianshu.com/p/7a76bcc401a1 安装MySQL: https://www.cnblogs.com/luohanguo/p/9 ...
- GO测试
测试 Go拥有一个轻量级的测试框架,它由 go test 命令和 testing 包构成. 你可以通过创建一个名字以 _test.go 结尾的,包含名为 TestXXX 且签名为 func (t *t ...
- win7系统中开启wifi热点
1.进入cmd下 2.输入命令创建一个热点,名称为testwifi,密码为12345678 netsh wlan 3.进入网络和共享中心->更改适配器设置,看到多出一个“无线网络连接2”,选中本 ...
- 三、linux基础-常用命令man_cd_|_find_ln_>_history
3通用命令3.1 man命令man pwd 来查看该命令的全部帮助手册备注:命令最终是在内核中执行的,但是内核并无法直接识别,所以先通过shell执行,然后再交给内核执行3.2 cd 命令c ...
- Day11 - L - 邂逅明下 HDU - 2897
当日遇到月,于是有了明.当我遇到了你,便成了侣.那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话)小t和所有世俗的人们一样,期待那百年难遇的日食.驻足 ...
- Centos7 mariadb (mysql)主从复制实现
一.mysql基本命令 .启动mysql systemctl start mariadb .linux客户端连接自己 mysql -uroot -p -h 127.0.0.1 .远程链接mysql服务 ...
- Python 基础之生成器
一.生成器表达式 生成器本质是迭代器,允许自定义逻辑的迭代器迭代器和生成器区别:迭代器本身是系统内置的,重写不了.而生成器是用户自定义的,可以重写迭代逻辑生成器可以用来钟方式创建: (1)生成器 ...
- springboot 时间戳和 数据库时间相差14个小时
在 springboot 开发过程中遇到一个奇怪的问题,就是已经设置系统时间GMT+8, 但是时间到数据库后会减少14个小时.后来发现是 jvm 时区和数据库时区设置不一致的问题. jvm 设置的是 ...