【题解】[ABC306G] Return to 1(数论)

news2024/10/5 15:22:35

【题解】[ABC306G] Return to 1

题目链接

ABC306G - Return to 1

题意概述

本题多测,\(T\) 组数据。

对于每组数据,给定一个 \(n\) 个点 \(m\) 条边的有向图,无重边自环。

问从顶点 \(1\) 出发,能否恰好走 \({10^{10}}^{100}\) 步回到 \(1\)

数据范围

  • \(1≤T,N,M≤2\times 10^5\)
  • \(\sum N \le 2 \times 10^5,\sum M \le 2 \times 10^5\)

思路分析

首先,可以删掉图中无法从顶点 \(1\) 出发到达的点,和无法到达顶点 \(1\) 的点,因为无论怎么走都不可能经过这些点。那么删掉后的图是强联通的。


\(L\) 表示图中所有经过 \(1\) 的环长集合,\(d\)\(L\) 中所有数的 \(\gcd\)。那么若从 \(1\) 出发能恰好走 \({10^{10}}^{100}\) 步回到 \(1\) 当且仅当:\(d\)\({10^{10}}^{100}\) 的约数。

证明:

由于我们要从开始恰好走 \({{10}^{10}}^{100}\) 步回到 \(1\)。假设原图中有两个长度为 \(a\)\(b\) 的环,那么就相当于找两个非负整数 \(x\)\(y\),使得 \(ax+by=c\),其中 \(c={{10}^{10}}^{100}\)

那么问题就转化为:对于方程 \(ax+by=c\),它有解的充要条件当且仅当 \(d|c\),其中 \(d=\gcd(a,b)\)

充分性:根据裴蜀定理可知:存在 \(x_0,y_0\) 使得 \(ax_0+by_0=d\) ,又 \(d|c\),所以 \(c=dk=(ax_0+by_0)k=a(kx_0)+b(ky_0)\),所以方程有整数解 \((kx_0,ky_0)\)

必要性:因为 \(ax_0+by_0=c\)\(d\)\(a,b\) 的最大公约数,所以 \(d|a,d|b\) ,所以 \(d|(ax_0+by_0)\),即 \(d|c\)

更一般地,当原图中环的个数超过两个时,我们可以用归纳法证明出对于 \(L\) 里所有元素 \(a_1-a_n\),方程 \(a_1x_1+a_2x_2+a_3x_3+\cdots+a_nx_n=c\) 有解当且仅当 \(\gcd(a_1,a_2,\cdots,a_n)|c\)

那么我们现在就可以有一个清晰的思路:暴力把所有的环长求出来,取它们的 \(\gcd\),判断其是否为 \({{10}^{10}}^{100}\) 的约数。

但是当经过 \(1\) 的环很多时,这种方法复杂度显然接受不了,所以考虑优化。


走到这一步,问题实际上可以转化为:

给定若干个经过 \(1\) 的环,如何求出这些环长的 \(\gcd\)

我们考虑反向思考,首先要弄明白一个问题:对于一个数 \(x\),怎么判断它是否是所有经过 \(1\) 环长的公约数(注意这里不是最大)?

有一个方法是:从 \(1\) 开始 dfs 一遍所有点计算出每个点 \(i\)\(1\) 的距离 \(dep_i\),那么要使得如果 \(x\) 是所有环长的公约数,则在 \(\bmod x\) 意义下,对于图中的每条边 \(u\rightarrow v\) 都满足 \(dep_u+1=dep_v\)

证明:

首先考虑简单环:

  • 如果给定一堆简单环,我们从 \(1\) 开始 dfs 给每个点标记一个模 \(x\) 意义下的 \(dep\),那么每个环一定都是按照一定顺序像 \(0,1,2,\cdots ,x-1,0,1,\cdots\) 这样标号的。
  • 假设一个环环长为 \(len\),那么从 \(1\) 开始 dfs,到第 \(len-1\) 个点的过程中,对于非第 \(len-1\) 个点,无论如何一定有 \(dep_u+1=dep_v\),这是显然的。
  • 对于第 \(len-1\) 个点当且仅当它的 \(dep\) 不是 \(x-1\) 时,这个点的编号加一模 \(x\) 不等于 \(dep_1=0\),此时 \(x\) 一定就不是该环环长的约数,与“\(x\) 是所有环长公约数”矛盾。

然后考虑复杂环:

  • 复杂环与简单环的最主要区别就在于简单环一定不会存在公用边,也就是不会多个环经过同一条边的情况,而复杂环可能会出现。

  • 假设有两个环,环长均是 \(x\) 的约数,从 \(1\) 出发经过不同的路径到达一个点 \(u\),然后再沿着同一条从 \(u\)\(1\) 路径回到 \(1\)。比如下图(两个环分别从 \(1\) 出发沿着不同路径到达 \(3\) 再沿着相同的路径从 \(3\) 回到 \(1\))。定义这个 \(u\) 为两个环的交汇点\(len_1\)\(len_2\) 为两个环环长。

  • 那么对于两个环非交汇点,同样无论如何一定有 \(dep_u+1=dep_v\)(与简单环相同)。

  • 对于两个环交汇点 \(u\)(相当于图中的 \(3\)),如果存在其中一个环的一条边 \(v\rightarrow u\),使得模 \(x\) 意义下不满足 \(dep_v+1= dep_u\),那么当且仅当这两个环的环长差 \(|len_1-len_2|\) 不是 \(x\) 的倍数。

  • 由于 \(x\)\(len_1\)\(len_2\) 的公约数,所以 \(\gcd(len_1,len_2)|x\)。根据更相减损法,有 \(\gcd(len_1,len_2)=\gcd(len_1,|len_1-len_2|)\),所以 \(\gcd(len_1,|len_1-len_2|)|x\),所以 \(|len_1-len_2|\) 一定是 \(x\) 的倍数。

img

由于 \(x\) 是所有环长的公约数时,在 \(\bmod x\) 意义下,对于图中的每条边 \(u\rightarrow v\) 都满足 \(dep_u+1=dep_v\),即 \(dep_u+1-dep_v\equiv 0 \pmod {x}\),所以 \(x\) 是所有 \(dep_u+1-dep_v\) 的公约数。

同理,要使得 \(x\) 是所有环长的 \(\gcd\),那么它也应该是所有 \(dep_u+1-dep_v\)\(\gcd\)

那么我们直接枚举所有边 \(u \rightarrow v\) 求出 \(dep_u+1-dep_v\)\(\gcd\) 即可。

最后一步就是要判断这个 \(\gcd\) 是不是 \({{10}^{10}}^{100}\) 的约数。

由于 \({{10}^{10}}^{100}\) 只有 \(2\)\(5\) 两个质因数,且 \({{10}^{10}}^{100}\) 很大,所以只需要判断 \(\gcd\) 是否只有 \(2\)\(5\) 两个质因子,若是,则答案 Yes,反之是 No


总体来说,这个题大的方面分为三步:先删掉图中无关的点;再将问题转化为求所有环长的 \(\gcd\);最后求这些环长 \(\gcd\)

总复杂度 \(O(T\max(n,m))\)

注意多测清空。

代码实现

//G
//The Way to The Terminal Station…
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define mk make_pair
#define pii pair<int,int>
using namespace std;
const int maxn=2e5+10;
int ok[maxn],dep[maxn];//ok[i] 表示 i 是否为有用点(即能不能到达 1)。

basic_string<int>edge[maxn],edge2[maxn];

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

void dfs(int x)
{
	ok[x]=1;
	for(int y:edge2[x])
	{
		if(ok[y])continue;
		dfs(y);
	}
}

void dfs2(int x)
{
	for(int y:edge[x])
	{
		if(!ok[y])continue;
		if(dep[y]!=-1)continue;
		dep[y]=dep[x]+1;
		dfs2(y);
	}
}

int gcd(int a,int b){if(b==0)return a;return gcd(b,a%b);}

int main()
{
	int T=read();
	while(T--)
	{
		int n,m;
		n=read();m=read();
		for(int i=1;i<=n;i++)edge[i].clear(),edge2[i].clear(),dep[i]=-1,ok[i]=0;
		for(int i=1;i<=m;i++)
		{
			int u,v;
			u=read();v=read();
			edge[u]+=v;
			edge2[v]+=u;
		}
		dfs(1);
		dep[1]=0;
		dfs2(1);
		int d=0;
		for(int u=1;u<=n;u++)
		{
			if(dep[u]==-1)continue;
			for(int v:edge[u])
			{
				if(dep[v]==-1)continue;
				d=gcd(d,abs(dep[u]+1-dep[v]));
			}
		}
		if(!d){cout<<"No"<<'\n';continue;}//没有经过 1 的环。
		while(d%2==0)d/=2;
		while(d%5==0)d/=5;
		if(d==1)cout<<"Yes"<<'\n';
		else cout<<"No"<<"\n";
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【八大排序(七)】归并排序初级篇-递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 归并排序 1. 前言2. 归并排序基本思路3. …

在数组中各位置上计算该位置以前所有元素的累加结果(Nan值视为0)numpy.nancumsum()

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 在数组中各位置上计算该位置以前 所有元素的累加结果&#xff08;Nan值视为0&#xff09; numpy.nancumsum() [太阳]选择题 以下说法错误的是&#xff1a; import numpy as np a np.array([[n…

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入 最近入手了兮克2.5G交换机&#xff08;兮克SKS1200-8GPY1XF&#xff09;&#xff0c;有 8 个 2.5G 电口和 1 个 10G SFP 光口&#xff1b;支持多种组网模式&#xff0c;其中一种是支持使用猫棒接入&#xff0c;由路由器…

聊聊微服务到底该如何划分

背景 现在动不动就是微服务架构&#xff0c;但是微服务划分的合理与否会极大的影响开发过程中的复杂度&#xff0c;划分的重要性不言而喻&#xff0c;但是在微服务划分这条路上并没有银弹&#xff0c;有的说DDD可以解决微服务的划分问题&#xff0c;吕哥想说的是那只是理论上的…

Linux常用命令——gcc命令

在线Linux命令查询工具 gcc 基于C/C的编译器 补充说明 gcc命令使用GNU推出的基于C/C的编译器&#xff0c;是开放源代码领域应用最广泛的编译器&#xff0c;具有功能强大&#xff0c;编译代码支持性能优化等特点。现在很多程序员都应用GCC&#xff0c;怎样才能更好的应用GCC…

Linux---上传和下载、压缩和解压

1. 上传下载 可以通过FinalShell工具&#xff0c;方便的和虚拟机进行数据交换。 在FinalShell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图&#xff0c;可以方便的&#xff1a; 浏览文件系统&#xff0c;找到合适的文件&#xff0c;右键点击下载&#xff0c;即可…

STL中set与map介绍

目录 一. 键值对1. 关联式容器2. pair3. 应用场景 二. set1. set的介绍2. set的使用3. multiset的介绍 三. map1. map的介绍2. map的使用3. multimap的介绍 一. 键值对 ​ 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般只包含两个成员变量key和value。key代表键…

Draw.io 高阶用法

drawio是一款非常不错画流程图的软件&#xff0c;而且是免费的&#xff0c;但大部分图形以2D为主&#xff0c;有时候 却需要一些3D效果来增强方案 举个例子&#xff1a; 需要变成这样&#xff0c;看起来更3D 方法&#xff1a; 先拖入一个圆形&#xff0c;把限制比例去掉&a…

【C数据结构】队列_Queue

目录 队列_Queue 【1】队列的概念及结构 【2】节点队列的实现 【2.1】队列的各个接口 【2.2】队列的初始化 【2.3】队列栈的释放 【2.4】队尾入队列 【2.5】队头出队列 【2.6】获取队列头部元素 【2.7】获取队列尾部元素 【2.8】获取队列中有效元素个数 【2.9】检测…

图像 检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点&#xff08;arXiv 2019&#xff09; 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A&#xff1a;模型…

Nginx安装Windows、Linux | 正向代理、反向代理、负载均衡

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可用作电子邮件代理服务器和通用TCP/UDP代理服务器。它是一个轻量级的Web服务器&#xff0c;可以作为静…

[进阶]Java:线程概述、线程创建方式

什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 多线程是什么&#xff1f; 多线程是指从软硬件上…

【现代数据架构】面向初创公司的现代数据堆栈

“为工作使用正确的工具&#xff01;” 这句话一开始听起来很简单&#xff0c;但在实际方面实施起来却非常复杂。早期的初创公司发现很难选择生态系统中可用的各种工具&#xff0c;因为它们的数据将如何演变是非常不可预测的。 需要现代数据堆栈 在过去 10 年中&#xff0c;软件…

c++11 标准模板(STL)(std::basic_ios)(四)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容 VMware 支持的 OpenStack 发行版&#xff1a;在 VMware 虚拟化技术之上运行企业级 OpenStack 云 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vio-7/&#xff0c;查看最新版。原创…

极易搭建的代码托管平台Gitea

这礼拜有点霉啊&#xff0c;先是日常自用的机器上&#xff0c;SSD 挂了&#xff0c;彻底识别不了的那种 隔了两天&#xff0c;用来写文章用的小机器上&#xff0c; 500G 的机械硬盘也挂了&#xff0c;重新格了一下&#xff0c;挂在玩客云上当个下载盘用吧 好在都有备份&#xf…

[进阶]Java:文件字节输出流、文件拷贝、资源释放

文件字节输出流&#xff08;FileOutputStream&#xff09;写数据出去的API 流的关闭和刷新 代码演示如下&#xff1a; ​​​​​​​ public class OutputStreamDemo04 {public static void main(String[] args) throws Exception {//1.创建一个文件字节输出流管道与目标文件…

WPF开发txt阅读器14:通过C#代码设计UI布局

文章目录 需求分析C#代码UI设计 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进快退&#x1f48…

ad18学习笔记六:ad18官方在线文档

这个挺有用&#xff0c;反正我是没找到离线的、完整的、详细的软件说明文档&#xff0c;只有去官网看在线的&#xff0c;有点卡&#xff0c;还是全英文的。 具体的位置直接进官网&#xff0c;比如这个&#xff1a; Board Region | Altium Designer 18.0 User Manual | Docume…

BOSHIDA AC DC电源模块在光纤通信设备的应用

BOSHIDA AC DC电源模块在光纤通信设备的应用 随着科技的不断发展&#xff0c;光纤通信技术逐渐成为人们日常生活和工作中广泛采用的一项技术。在光纤通信设/备中&#xff0c;稳定的电源模块是其正常运转的关键。AC DC电源模块在光纤通信设/备的应用也越来越广泛。 AC DC电源模…