Solution -「AGC 003D」「AT 2004」Anticube
\(\mathcal{Description}\)
Link.
给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数。
\(n\le10^5\),\(a_i\le10^{10}\)。
\(\mathcal{Solution}\)
  特判完全立方数——至多选一个。然后按一贯的套路约去立方因子。不过由于值域比较大,我们可以只筛出 \(\max\{a_i\}^{\frac{1}3}\) 的素数,计算这些素数在 \(a_i\) 的标准分解中的指数,借此求出 \(a_i\) 和能与 \(a_i\) 配成完全立方数的指数。而对于未被这些素数筛掉的部分,暴力判断是否是平方数就能计算出配对的数了。显然配对是相互的,所以用 std::map 做桶,在能配对的两个数中贪心地选取出现次数更多的数即可。
复杂度 \(\mathcal O(n(\pi(\max\{a_i\}^{\frac{1}3})+\log n))\)。
\(\mathcal{Code}\)
#include <map>
#include <cmath>
#include <cstdio>
#include <iostream>
typedef long long LL;
#define int LL
const int MAXN = 1e5, MAXFAC = 2155;
const LL MAXV = 1e10;
int n, pn, pr[MAXFAC + 5], siz[MAXN + 5], rev[MAXN + 5];
LL val[MAXN + 5];
bool vis[MAXFAC + 5];
std::map<LL, int> buc;
inline LL rint () {
	LL x = 0; char s = getchar ();
	for ( ; s < '0' || '9' < s; s = getchar () );
	for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
	return x;
}
inline void sieve ( const int n ) {
	for ( int i = 2; i <= n; ++ i ) {
		if ( ! vis[i] ) pr[++ pn] = i;
		for ( int j = 1; j <= pn && i * pr[j] <= n; ++ j ) {
			vis[i * pr[j]] = true;
			if ( ! ( i % pr[j] ) ) break;
		}
	}
}
inline bool issqr ( const LL x ) {
	LL t = pow ( x, 1.0 / 3 );
	return t * t * t == x || ( t + 1 ) * ( t + 1 ) * ( t + 1 ) == x;
}
signed main () {
	n = rint (), sieve ( MAXFAC );
	int ans = 0;
	for ( int i = 1; i <= n; ++ i ) {
		LL a = rint ();
		if ( issqr ( a ) ) { ans = 1; continue; }
		LL cur = 1, mtc = 1;
		for ( int j = 1; j <= pn && pr[j] <= a; ++ j ) {
			int cnt = 0;
			for ( ; ! ( a % pr[j] ); a /= pr[j], ++ cnt );
			if ( ! ( cnt %= 3 ) ) continue;
			cur *= pr[j], mtc *= pr[j];
			if ( cnt == 1 ) mtc *= pr[j];
			else cur *= pr[j];
			if ( mtc > MAXV ) mtc = 0;
		}
		LL sqt = sqrt ( a );
		cur *= a;
		if ( sqt * sqt == a || ( sqt + 1 ) * ( sqt + 1 ) == a ) mtc *= sqt;
		else {
			mtc *= a;
			if ( mtc > MAXV ) mtc = 0;
			mtc *= a;
		}
		if ( mtc > MAXV ) mtc = 0;
		if ( ! buc.count ( cur ) ) siz[buc[cur] = i] = 1, rev[i] = mtc;
		else ++ siz[buc[cur]];
		val[i] = cur;
	}
	for ( int i = 1; i <= n; ++ i ) {
		if ( ! siz[i] ) continue;
		if ( ! buc.count ( rev[i] ) ) {
			ans += siz[i], siz[i] = 0;
		} else {
			ans += std::max ( siz[i], siz[buc[rev[i]]] );
			siz[i] = siz[buc[rev[i]]] = 0;
		}
	}
	printf ( "%lld\n", ans );
	return 0;
}
												
											Solution -「AGC 003D」「AT 2004」Anticube的更多相关文章
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
		
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
 - 「题解」「美团 CodeM 资格赛」跳格子
		
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
 - 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
		
http://www.4gamer.net/games/216/G021678/20140714079/ 连载第2回的本回, Arc System Works开发的格斗游戏「GUILTY G ...
 - Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory
		
Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...
 - SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法
		
用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...
 - 「Windows MFC 」「Edit Control」 控件
		
「Windows MFC 」「Edit Control」 控件
 - 「ZJOI2019」&「十二省联考 2019」题解索引
		
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
 - Loj #6069. 「2017 山东一轮集训 Day4」塔
		
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
 - Loj #6073.「2017 山东一轮集训 Day5」距离
		
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
 
随机推荐
- 利用Word2010制作流程图
			
利用Word2010制作流程图 原文链接:https://www.toutiao.com/i6483034968225235469/ 一.页面和段落的设置 启动Word2010,打开一个空白文档,并切 ...
 - Go 中实现用户的每日限额(比如一天只能领三次福利)
			
如果你写一个 bug 管理系统,用了这个 PeriodLimit 你就可以限制每个测试人员每天只能给你提一个 bug.工作是不是就轻松很多了? 如今微服务架构大行其道本质原因是因为要降低系统的整体复杂 ...
 - Centos上通过yum命令删除有关MySQL
			
1.停止mysql 服务service mysql stop 2.刚开始使用的yum安装的,使用以下语句进行卸载 yum remove mysql* 3.然后删除mysql旧版本已经存在的文件或者数据 ...
 - 使用Cesium Stories在3D Tilesets中检查Features
			
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 我们创建了3D Tiles用以流式化.可视化和分析大量的三维内容 ...
 - 深入理解http1.x、http 2和https
			
转自 https://segmentfault.com/a/1190000015316332 一.HTTP/1.x Http1.x 缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制数 ...
 - IDEA包名分层问题
			
解决办法: 将默认的"Hide empty Middle Packages"或者"compact middle packages"勾选项去掉,这样就不会把中间空 ...
 - python全局解释器GIL锁(-死锁)
			
目录 一:Python中的GIL锁 1.GIL介绍 2.GIL的作用 3.cpython 4.内存管理>>>垃圾回收机制 二:全局解释器锁GIL 1.GIL特点 三:计算密集型与IO ...
 - linux中awk命令(最全面秒懂)
			
目录 一:linux中awk命令 1.awk命令简介 2.awk作用 3.awk的语法格式 4.解析awk使用方法 5.参数 6.awk的生命周期 二:awk中的预定义变量 三:awk运行处理规则的执 ...
 - linux正则sed实战案例详解
			
目录 1. 将nginx.conf中的注释全部去掉 2. 将nginx.com中每一行之前增加注释 3.要求一键修改本机的ip 4.将/etc/passwd中的root修改成ROOT 1. 将ngin ...
 - Gc如何判断对象可以被回收?
			
Gc如何判断对象可以被回收? 1 引用计数器 引用计数法的算法思路:给对象增加一个引用计数器,每当对象增加一个引用计数器+1,失去一个引用-1,所以当计数器是0的时候对象就没有引用了,就会被认为可回收 ...