3444: 最后的晚餐
3444: 最后的晚餐
https://www.lydsy.com/JudgeOnline/problem.php?id=3444
分析:
计数。
首先判断无解的情况,因为这是一张长桌子,所以出现了环无解,然后并查集判环。如果是两个人之间的环,可以跳过。因为每个人只能和两个人挨着,所以三个及三个以上都想和一个人挨着,那么无解。
然后就成了很多条序列,往一个大的序列上放,那么全排列为Ann,即n!。对于每个序列,它又有两种方法排列,(长度为1的只有一种),然后再乘以2。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 5 inline int read() { 6 int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; 7 for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; 8 } 9 10 const int mod = 989381; 11 const int N = 500100; 12 13 int fa[N], du[N], cnt[N], L[N]; 14 15 int find(int x) { 16 return x == fa[x] ? x : fa[x] = find(fa[x]); 17 } 18 19 int main() { 20 21 int n = read(), m = read(), tot = 0; 22 for (int i=1; i<=n; ++i) fa[i] = i; 23 24 for (int t1,t2,i=1; i<=m; ++i) { 25 int u = read(), v = read(); 26 if (u == L[v]) continue; 27 28 if ((t1=find(u)) == (t2=find(v)) || du[u] >= 2 || du[v] >= 2) { 29 puts("0");return 0; 30 } 31 32 L[u] = v; 33 du[u] ++, du[v] ++; // du[t1]++ , du[t2]++ 34 fa[t1] = t2; 35 } 36 37 LL ans = 1; 38 39 for (int i=1; i<=n; ++i) cnt[find(i)] ++; 40 41 for (int i=1; i<=n; ++i) { 42 if (cnt[i]) { 43 if (cnt[i] > 1) ans = (ans * 2) % mod; 44 tot ++; 45 } 46 } 47 48 for (int i=1; i<=tot; ++i) ans = (ans * i) % mod; 49 50 cout << ans; 51 52 return 0; 53 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容