【题解】CF1986G1

news2024/11/22 16:42:09

目录

  • 翻译
  • 思路
  • 代码
  • 关于G2的想法

翻译

原题链接
在这里插入图片描述

思路

  数据很大,显然两边同时处理,所以要从 p i i \frac{p_{i}}{i} ipi下手。
  要让 p i i ∗ p j j \frac{p_{i}}{i} * \frac{p_{j}}{j} ipijpj是整数,每个 p i i \frac{p_{i}}{i} ipi都可以提供分子上的若干个因子,又需要别人提供分母上的所有因子。
  对于每一个 p i p_{i} pi,记 d = g c d ( p i , i ) d=gcd(p_{i}, i) d=gcd(pi,i) P = p i d , Q = i d P=\frac{p_{i}}{d},Q=\frac{i}{d} P=dpiQ=di,我们记录所有二元对 ( x , y ) (x, y) (x,y),满足 x ∣ P x|P xP y = Q y=Q y=Q,意义是它能提供因子 x x x,又需要因子 y y y
  能和 p i i \frac{p_{i}}{i} ipi配对的数量就是之前记录的 ( y , x ) (y, x) (y,x)的数量。

  由于要分解因子和使用 m a p map map,时间复杂度为 O ( n n l o g n ) O(n \sqrt{n}logn) O(nn logn)

代码

#include<bits/stdc++.h>
#define N 100005
using namespace std;
map<pair<int, int> , int> m;
int t, n, p[N];
int gcd(int x, int y) {
	if(y == 0) return x;
	return gcd(y, x%y);
}
int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		long long ans = 0;
		m.clear();
		for(int i=1;i<=n;i++) scanf("%d", p+i);
		for(int i=1;i<=n;i++) {
			int d = gcd(i, p[i]);
			int P = p[i] / d, Q = i / d;
			for(int j=1;j*j<=P;j++) {
				if(P % j == 0) {
					ans += m[{Q, j}];
					if(j * j != P) {
						ans += m[{Q, P/j}];
					}
				}
			}
			
			for(int j=1;j*j<=P;j++) {
				if(P % j == 0) {
					m[{j, Q}] ++;
					if(j * j != P) {
						m[{P/j, Q}] ++;
					}
				}
			}
		}
		cout<<ans<<endl;
	}
}

关于G2的想法

  先把G1的代码改一改数据范围丢进去再说,结果预料中的TLE没出现,内存先爆了。这也正常,最多花多少内存不会算 ,但肯定是map花了太多内存。然后想了点办法:

  (1)用swap方法彻底释放map的内存。
  (2)注意到只有存在一个 i i i需要对应的 Q Q Q,我们才在 x = Q 且 x ∣ P j x=Q且x|P_{j} x=QxPj时记录下 ( x , y ) (x, y) (x,y)。而这样的 Q Q Q最多只有 n n n个。所以在记录前判断一下。
  (3)在读取map中的数据之前判断一下数据是否在map中。

  效果不错,MLE变TLE了,也就是说时间复杂度也得改,这个 l o g log log不能要。

  然后map其实就是用来计数的,所以我想到了hash,手写肯定不行,又得MLE,于是用上了unordered_map。

  然后调了半天,先是C++版本不行,然后是没有内置的关于pair的映射,要重定义一下,最后好不容易编译过了,还是TLE。

  后面试了一下开long long避免哈希冲突地太厉害,没什么用。

  总之就是裂开了,代码放下面,有哪位大佬能救一下的或者指出原因的欢迎评论QwQ。

#include<bits/stdc++.h>
#define N 500005
using namespace std;
namespace std {
    template<> struct hash<pair<int, int> > {
        size_t operator()(const pair<int, int>& p) const {

            return hash<int>()(p.first) ^ hash<int>()(p.second);
        }
    };
}
unordered_map<pair<int, int> , int> m;
int t, n, p[N];
bool needed[N];
inline int gcd(int x, int y) {
	if(y == 0) return x;
	return gcd(y, x%y);
}
int main() {
	cin>>t;
	while(t--) {
		scanf("%d", &n);
		long long ans = 0;
		unordered_map<pair<int, int>, int>().swap(m);    // 可以清空内存 
		for(int i=1;i<=n;i++) scanf("%d", p+i);
		for(int i=1;i<=n;i++) {
			int d = gcd(i, p[i]);
			int P = p[i] / d, Q = i / d;
			needed[Q] = true;
		}
		for(int i=1;i<=n;i++) {
			int d = gcd(i, p[i]);
			int P = p[i] / d, Q = i / d;
			for(int j=1;j*j<=P;j++) {
				if(P % j == 0) {
					if(m.find({Q, j}) != m.end()) ans += m[{Q, j}];
					if(j * j != P) {
						if(m.find({Q, P/j}) != m.end()) ans += m[{Q, P/j}];
					}
				}
			}
			
			for(int j=1;j*j<=P;j++) {
				if(P % j == 0) {
					if(needed[j]) m[{j, Q}] ++;
					if(j * j != P) {
						if(needed[P/j]) m[{P/j, Q}] ++;
					}
				}
			}
			
		}
		
		for(int i=1;i<=n;i++) {
			int d = gcd(i, p[i]);
			int P = p[i] / d, Q = i / d;
			needed[Q] = false;
		}
		printf("%d\n", ans)
	}
}

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

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

相关文章

Leetcode 二叉树中根遍历

采用递归算法&#xff0c;并且用一个向量来存储节点值。 算法C代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}*…

GLSL 棋盘shader

今日永杰开金 float size 100.;vec2 checkerboard mod(floor(gl_FragCoord.xy / size), 2.);float c mod(checkerboard.x checkerboard.y, 2.);gl_FragColor vec4(vec3(c), 1);或 vec2 uv floor(S * p.xy * vec2(iResolution.x / iResolution.y, 1) / iResolution.xy); …

文件的常用操作

目录 一、文件的常用操作 1、创建文件 2、读文件 3、写文件 4、删除文件 一、文件的常用操作 1、创建文件 需求&#xff1a;在d盘的a目录下创建hi.txt文件&#xff0c;a目录已经创建好 # 需求&#xff1a;在d盘的a目录下创建hi.txt文件&#xff0c;a目录已经创建好 &qu…

RuoYi-Vue3使用minio图片预览不了的问题

参照官网配置好之后&#xff0c;图片预览不了 1、参照官网修改前端src\components\ImageUpload\index.vue 2、如果图片预览不了&#xff0c;发现是Minio后台返回的url地址内部包括逗号 与代码里split(",")冲突了&#xff0c; 解决方法是改成分号 多个图片可以预览了…

重大消息!LLMWorld 推出开源应用广场,100 多个前沿 AI 应用引关注

宝藏网站LLM World 上线了开源应用广场&#xff0c;汇聚了 100 多个前沿的 AI 应用。 开源应用的出现降低了技术门槛&#xff0c;无论是专业开发者还是普通爱好者&#xff0c;都能在此轻松接触先进的人工智能技术&#xff0c;进行学习和实践。 期待 LLMWorld 能持续汇聚更多优…

在Linux系统中如何创建一个新用户

在Linux系统下创建一个新用户既可以用图形桌面系统&#xff0c;也可以用字符终端命令行的方式来建立。 一、在图形桌面下建立一个新用户“xiaodu”。 如图1&#xff0c;打开设置界面&#xff0c;选中“账户”选项。 图1 选中账户选项 进入“账户”选项后&#xff0c;如图2&a…

初学者指南:如何在Windows 11中自定义任务栏颜色,全面解析!

Windows任务栏如何修改颜色&#xff1f;任务栏可以说是电脑桌面上比较不“起眼”的东西&#xff0c;但是也有不少小伙伴会想要将自己的电脑任务栏设置得好看&#xff0c;比如说修改电脑任务栏透明度&#xff0c;以及修改任务栏颜色。 电脑任务栏设置可以修改任务栏颜色&#xf…

mysql学习教程,从入门到精通,SQL ORDER BY 子句(14)

1、SQL ORDER BY 子句 在本教程中&#xff0c;您将学习如何对SELECTSQL查询返回的数据进行排序。 1.1、对结果集排序 通常&#xff0c;当您使用SELECT语句从表中获取数据时&#xff0c;结果集中的行没有任何特定的顺序。如果要按特定顺序排列结果集&#xff0c;则可以在语句…

镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态

当今企业数据管理日益规范化&#xff0c;数据应用系统随着数据类型与数量的增长不断细分&#xff0c;为了提升市场竞争力与技术实力&#xff0c;数据领域软件服务商与上下游伙伴的紧密对接与合作显得尤为重要。通过构建完善的生态系统&#xff0c;生态内企业间能够整合资源、共…

只有C盘的windows系统通过磁盘分区分出D盘

为什么要从C盘中分出D盘&#xff1f; windows电脑的一个良好的操作规范是&#xff1a;C盘是系统盘&#xff0c;D盘是软件盘&#xff0c;E盘是数据盘&#xff0c;软件一般安装在D盘&#xff0c;大家的一些数据资料可以放在E盘&#xff0c;软件大家一般按照在C盘系统盘&#xff…

GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制

文章目录 GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制概述笔记失败图成功图蜂鸣器管脚波形总结END GD - GD32350R_EVAL - PWM实验和验证3 - EmbeddedBuilder - 无源蜂鸣器 - 用PMOS来控制 概述 以前做了一个实验&#xff0c;用PMOS来…

电阻、电容、电感的封装大小分别与什么参数有关?

电阻封装大小与电阻值、额定功率有关&#xff1b; 电容封装大小与电容值、额定电压有关&#xff1b; 电感封装大小与电感量、额定电流有关。

4款高效的视频剪辑工具,帮你记录精彩瞬间。

随着各种主流媒体的流行&#xff0c;视频剪辑对与很多人来说都不是难题。因为相较于那些专业门槛相对较高的剪辑工具&#xff0c;现在有很多的剪辑工具使用起来都很简单&#xff0c;也完全能够满足大部分的剪辑需求。这次&#xff0c;我便要帮大家盘点4款专业、简单、易用的视频…

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…

AI智能体:一步步教你制作扣子工作流

这是一篇关于字节智能体平台扣子制作工作流的笔记。 完整智能体可参考&#xff1a;基于扣子(Coze)打造第一个智能体——个性化对话机器人 使用工作流优化机器人输出 1 旅游机器人的业务流程 提到工作流&#xff0c;不要感觉有什么高大上的&#xff0c;工作流本质就是我们完…

根据NVeloDocx Word模板引擎生成Word(六-结束)

前面几篇已经把E6开发平台配套的Word模版隐藏NVeloDocx的基础用法介绍了一遍&#xff0c;这些基础用法基本上可以完全覆盖实际业务的绝大部分需求。所以我们这一篇就介绍一些边边角角的内容&#xff0c;给本系列来一个首尾。 本篇的主要内容有&#xff1a; 1、汇总计算&#…

Nacos1.X中对NacosNamingService的实现

Nacos服务注册与发现的实现原理图 服务注册与发现的功能&#xff1a; 服务实例启动时注册到服务注册表、关闭时则注销&#xff08;服务注册&#xff09;服务注册中心根据服务实例定时发送的心跳包&#xff0c;实现健康检测&#xff08;健康检查BeatReactor中的BeatTask&#x…

打造最佳自闭症患全寄宿学校:为孩子的未来保驾护航

在自闭症儿童教育的广阔领域里&#xff0c;寻找一所能够全方位关注孩子成长、为他们的未来奠定坚实基础的学校&#xff0c;是许多家庭的心愿。广州的星贝育园自闭症儿童寄宿制学校&#xff0c;正是这样一所致力于成为最佳的自闭症儿童全寄宿学校&#xff0c;它以独特的教育理念…

软件测试学习笔记丨Postman基础使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32096 一、Postman基础使用 1.1 简介 Postman是一款流行的API测试工具和开发环境&#xff0c;旨在简化API开发过程、测试和文档编制。优势&#xff1a; Postman可以快速构建请求&#xff0c…

使用 React Testing Library 测试自定义 React Hooks

自定义 React hooks为开发人员提供了在多个组件之间提取和重用常见功能的能力。然而&#xff0c;测试这些 hooks可能会有些棘手&#xff0c;特别是对于测试新手来说。在本文中&#xff0c;我们将探讨如何使用 React Testing Library 测试自定义 React hook。 测试 React组件 首…