[Daimayuan] Owwwwwwwwwww...f(C++,强连通分量)

2023/11/29 22:25:41

A A A地盘上的所有人被从 1 1 1 n n n 编号,每个人都有自己传话的对象,第 i i i 个人对第 a i a_i ai个人传话。 有一天,小 A A A在宫殿的顶部大声喊着 O w f Owf Owf,于是一个有趣的游戏在小 A A A的地盘上开始了。

规则如下:

该游戏有许多轮,每个人都会开始一轮游戏。如果编号为 x x x 的人想要开始一轮游戏,他会对第 a x a_x ax个人说" O w w . . . w w f Oww...wwf Oww...wwf"(有 t t t w w w)。如果 t > 1 t>1 t>1,第 a x a_x ax个人就会对第 a a x a_{ax} aax个人说" O w w . . . w w f Oww...wwf Oww...wwf"(有 t − 1 t−1 t1 w w w)。直到有人听到" O w f Owf Owf"( t = 1 t=1 t=1),这个人就是这一轮的 J o o n Joon Joon。不存在同时进行两轮游戏的情况。 为了使游戏更有意思,小 A A A有一个邪恶的计划。他想找到最小的 t t t t ≥ 1 t≥1 t1)使得对于每个人 x x x 当第 x x x 个人开始的一局游戏使 y y y 成为了 J o o n Joon Joon ,也使得由 y y y 开始的一局游戏 x x x 成为 J o o n Joon Joon 。请为小 A A A找这个最小的 t t t。 注意:可能有的人传话对象是自己。

输入格式:

第一行输入一个 n n n ( 1 ≤ n ≤ 150 1≤n≤150 1n150),表示小A地盘上的人数。

第二行输入 a 1 a_1 a1 a 2 a_2 a2 a 3 a_3 a3,… a n a_n an,第 i i i 个数表示第 i i i 个人传话的对象 a i a_i ai

输出格式:

输出最小的 t t t,如果没有请输出 − 1 −1 1

样例输入:

4
2 3 1 4

样例输出:

3

解题思路:

把题中序列抽象为一张有向图,有 n n n个节点、 n n n条有向边 < i , a i > <i,a_i> <i,ai>

如果能够达成题中所述的双向传话,两个人必须在一个环中。

如果环的长度为偶数,那么这个环的传话次数为其长度一半;

如果环的长度为奇数,那么这个环的传话次数为其长度。

我们需要做的就是统计每一个环的传话次数,然后计算最小公倍数即可。

很简单对吧qwq?

那么现在来实现代码。

首先是搜索环的长度:

void dfs(int bg) {
	int next = as[bg], sum = 1;
	book[bg] = true;
	while (next != bg) {
		if (book[next]) {
			fail = true;
			return;
		}
		sum++;
		book[next] = true;
		next = as[next];
	}
	if (sum % 2 == 0) ans.push_back(sum / 2);
	else ans.push_back(sum);
}

然后计算所有ans的最小公倍数:

long long ret = 1;
for (auto iter : ans) {
	ret = lcm((long long)(iter), ret);
}
cout << ret << endl;

后排提醒:/* 十年OI一场空,不开long long见祖宗 */

最后,AC代码如下:

#include <iostream>
#include <vector>
using namespace std;
const int max_n = 150;

int as[max_n + 1];
bool book[max_n], fail = false;
vector<int>ans;

void dfs(int bg) {
	int next = as[bg], sum = 1;
	book[bg] = true;
	while (next != bg) {
		if (book[next]) {//出现两个人传给同一个人的情况,失败
			fail = true;
			return;
		}
		sum++;
		book[next] = true;
		next = as[next];
	}
	if (sum % 2 == 0) ans.push_back(sum / 2);
	else ans.push_back(sum);
}

long long gcd(long long x, long long y) {
	long long t;
	while (y != 0) {
		t = x % y;
		x = y;
		y = t;
	}
	return x;
}

long long lcm(long long x, long long y) {
	long long ret = gcd(x, y);
	return x * y / ret;
}

int main() {
	int n, u, v;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> as[i];
	}
	for (int i = 1; !fail && i <= n; i++) {
		if (!book[i]) {
			dfs(i);
		}
	}
	if (fail) {
		cout << -1 << endl;
		return 0;
	}
	long long ret = 1;
	for (auto iter : ans) {
		ret = lcm((long long)(iter), ret);
	}
	cout << ret << endl;
	return 0;
}


http://www.jnnr.cn/a/482724.html

相关文章

项目风险应对策略:项目经理应对不确定性的指南

风险应对是项目经理管理项目未来的工具箱。它可以帮助管理人员弄清楚可能会出现什么问题&#xff0c;并让他们有机会为这些问题做好准备。 对抗负面风险的5种策略 如果没有风险管理计划&#xff0c;项目可能会因意外问题或不良风险而迅速脱轨。什么策略可以用来对抗负面风险&…

详解如何使用LAMP架构搭建论坛

文章目录 1.LAMP概述2.编译安装Apache httpd服务1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.安装环境依赖包 3.配置软件模块4.编译及安装5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别6.添加httpd系…

第六章 Matlab的复数数据、字符数据和附加画图类型

在第二章中,我们学习了 MATLAB 基础数据类型:double 和 char。MATLAB 还有许 多的附加数据类型,在本章,我们将会了解它们中的一个。我们要讨论的附加数据类型是 MATLAB 支持的复数数据。我们也将学习如何使用 char 数据类型,以及如何把 MATLAB 数组扩展为多维数组。 本章…

G0第21章 :gin框架介绍、RESTful API、Gin渲染

G0第21章 &#xff1a;gin框架 01 内容介绍 https://gin-gonic.com/zh-cn/docs/ web本质 Web是基于HTTP协议进行交互的应用网络Web就是通过使用浏览器/APP访问的各种资源 package mainimport ("fmt""net/http" )func sayHello(w http.ResponseWriter, r…

第十章:C语言的调试

很多小伙伴刚开始听到C语言的调试&#xff0c;这是个啥&#xff0c;表示很怀疑&#xff0c;敲代码不就是直接就是干嘛&#xff0c;结果很多小白们&#xff0c;一运行错误多的数都数不过来。就开始这改改&#xff0c;那删删&#xff0c;莫名奇妙就运行成功了。到最后都不知道到底…

面试官:你会从哪些维度进行MySQL性能优化?

面试官如果问你&#xff1a;你会从哪些维度进行MySQL性能优化&#xff1f;你会怎么回答&#xff1f; 所谓的性能优化&#xff0c;一般针对的是MySQL查询的优化。既然是优化查询&#xff0c;我们自然要先知道查询操作要经过哪些环节&#xff0c;然后思考可以在哪些环节进行优化…

创建web后端程序(servlet程序搭建)

目录 一、Servlet概述 二、创建servlet程序 1.创建类继承HttpServlet 2.重写HttpServlet类中 service、destroy、init方法 3.重新启动服务器 一、Servlet概述 Server Applet的简称&#xff0c;用Java编写的服务器端的程序。它运行在web服务器中&#xff0c;web服务器负责…

性能测试——系统性能数据收集和Prometheus 监控系统部署应用实战

系统性能数据收集和Prometheus 监控系统部署应用实战 一、部署性能监控工具 node-exporter1、拉取镜像2、启动容器&#xff1a;3、配置prometheus.yml4、重启prometheus系统&#xff0c;检查node-exporter targets数据是否显示正常 二、Prometheus 监控系统部署应用实战1、实战…

如何用 ChatGPT 做数据进阶可视化?(三维交互图与动图视频)

你只需输入数据和需求&#xff0c;结果自然来。 自动可视化 在《如何用 ChatGPT 帮你自动分析数据&#xff1f;》这篇文章里&#xff0c;我已经为你介绍过 Code Interpreter 。它是 ChatGPT 的一个模式&#xff0c;目前还在 alpha 测试阶段。 Code Interpreter 可以接收文件输入…

Java Servlet相关面试题

一、什么是servlet&#xff1f; Servlet是运行在java服务器中的小型Java程序。 作用&#xff1a;接收用户请求&#xff0c;并对请求作出处理&#xff0c;将处理结果相应给客户端。 Servlet是JavaWeb三大组件&#xff08;Servlet、过滤器&#xff0c;监听器 &#xff09;之一…

功能测试和自动化测试的差距在哪里?

一直以来&#xff0c;软件的测试主要是以手工测试为主&#xff0c;但是随着现代软件的复杂程度的加深&#xff0c;人们对使用手工方式来完成软件测试感到的越来越力不从心&#xff0c;同时因为在软件测试中存在着大量的重复性工作&#xff0c;而这种工作是比较适合机器而不是人…

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…

第10届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 击鼓游戏 题目说明 准备工作: 将复台背景设置为“spotight-stage”&#xff0c;添加一个“Belerina"角色、两个“Drum1"角色和两个“Drum2”角色&#xff0c;并按照图 7-1 的位置摆放。角色“Beleina"的造型和颜色的设置须如图 7-1所示&a…

老司机解读香农定理、奈奎斯特定理、编码与调制

工程师都会考虑一个问题&#xff1a;信道上到底可以传输多大的数据&#xff0c;或者指定的信道上的极限传输率是多少。这就是信道容量的问题。例如&#xff0c;在xDSL系统中&#xff0c;我们使用的传输介质是仅有几兆带宽的电话线&#xff0c;而上面要传送几兆、十几兆甚至几十…

学系统集成项目管理工程师(中项)系列25_计算机网络知识

1. OSI七层协议 1.1. 物理层 1.1.1. RS232、V.35、RJ-45、FDDI 1.2. 数据链路层 1.2.1. 【21上选17】 1.2.2. IEEE802.3/.2、HDLC、PPP、ATM 1.3. 网络层 1.3.1. IP、ICMP、IGMP、IPX、ARP 1.3.2. 路由选择 1.3.2.1. 【20下选17】 1.4. 传输层 1.4.1. TCP、UDP、SPX…

Java 集合 - 集合框架概述

文章目录 1.集合框架体系结构2.Collection 接口2.1 Iterator2.1.1 使用迭代器遍历集合2.1.2 使用迭代器删除集合元素2.1.3 Iterator 迭代器的 fail-fast 机制 2.2 Iterable2.3 List 集合2.4 Set 集合2.5 Queue 3.Map 集合 Java 集合框架&#xff08;Java Collections Framework…

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…

手撕代码——同步FIFO

手撕代码——同步FIFO 一、FIFO原理与设计二、完整代码与仿真结果三、仿真结果 一、FIFO原理与设计 查看Xilinx官方FIFO IP核&#xff0c;其主要的信号有时钟信号、写端口信号、读端口信号&#xff0c;其中&#xff0c;写端口信号包括写满信号full、写使能信号wr_en、写数据输入…

《深入理解BigDecimal:揭秘钱财计算的核心技术》

文章目录 《深入理解BigDecimal:揭秘钱财计算的核心技术》***\*一、BigDecimal概述\*******\*二、BigDecimal常用构造函数\****2.1、常用构造函数2.2、使用问题分析***\*三、BigDecimal常用方法详解\****3.1、常用方法3.2、BigDecimal大小比较***\*四、BigDecimal格式化\*****…

Vue事件

1&#xff0c;回顾js中的事件&#xff1f; 答&#xff1a;标签的状态变化或者被外物改变则称为事件。一般js中的事件都是由浏览器捕捉得到&#xff0c;然后传递给js引擎&#xff0c;浏览器检测到HTML页面中某个标签元素发生了指定的事件&#xff0c;而对应的DOM节点必须去调用回…
最新文章