【16届蓝桥杯寒假刷题营】第2期DAY4

【16届蓝桥杯寒假刷题营】第2期DAY4 - 蓝桥云课

问题描述

幼儿园小班的浩楠同学有一个序列 a。

他想知道有多少个整数三元组 (i,j,k) 满足 1≤i,j,k≤n 且 ai​×aj​=ak​。

输入格式

共2行,第一行一个整数 n,表示序列的长度。

第二行 n 个整数,表示序列的每一项。

输出格式

共一行,一个整数 ans,表示三元组的个数。

样例输入

复制代码
5
2 3 4 5 6

样例输出

复制代码
3

说明

满足条件的三元组有 (1,1,3), (1,2,5), (2,1,5)。

评测数据规模

对于100%的评测数据,1≤n≤1e5,1≤ai​≤1e5。

思路:

这题n最大1e5。我们可以优化成mlogm。

考虑枚举 ai​,aj​,可以发现当 ai​ 很大时,如果想要 ai​×aj​ 在 a 中出现,aj​ 必须很小。

下面证明这样枚举的时间复杂度时合理的:

根据调和级数 ∑i=1n​i1​=O(nlogn)。

设 m=105,那么满足 i×j≤m 的 (i,j) 至多只有 O(mlogm) 对。

记录每个元素出现的次数并统计即可。

时间复杂度 O(mlogm)。

代码如下:

复制代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const ll N = 1e5+10;
const ll M = 1e5;
ll n; 
ll has[N];
ll sum;
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	cin >> n;
	for(ll i = 1 ; i <= n ; i++)
	{
		ll x;
		cin >> x;
		has[x]++;
	}
	//暴力枚举
	for(ll i = 1 ; i <= M ; i++)
	{
		for(ll j = 1 ; i * j <= M ; j++)
		{
			sum += has[i]*has[j]*has[i*j];		
		}
	} 
	cout << sum;
}
相关推荐
C^h7 小时前
c++ string
开发语言·c++
raindayinrain7 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的7 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao7 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说9 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的9 小时前
C++第一节课
开发语言·c++
UIU1149 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
TMedical10 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗