\(\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的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  5. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  6. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. 物理机异常断电,linux虚拟机系统磁盘mount失败,导致无法启动; kubectl 连接失败

    虚拟机 CentOS 7 挂载文件系统失败 上周五下班前没有关闭虚拟机和物理机, 今天周一开了虚拟机之后,发现操作系统启动失败. 原因跟 这篇文章描述的一模一样. 解决操作系统的文件系统挂载的问题之后 ...

  2. 第10组 Alpha冲刺 (6/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14008187.html ·作业博客:https://edu.cnblogs.co ...

  3. 学习Layui笔记-父窗口获取子窗口的radio

    最近学习layui,使用radio做单项选择的时候,发现layui无论怎么取值,都是默认取到第一个radio的值. 百度下找解决方法. html页面部分 <div class="lay ...

  4. node之module与fs文件系统

    命令行窗口(小黑屏).cmd窗口.终端.shell 开始菜单 --> 运行 --> CMD --> 回车 常用的指令: dir 列出当前目录下的所有文件 cd 目录名 进入到指定的目 ...

  5. 10个JS技巧

    1.过滤唯一值 Set 对象是es6新引入的,配合扩展运算符[...]一起使用,我们可以用它来过滤数组的唯一值. const array = [1, 1, 2, 3, 5, 5, 1] const u ...

  6. 移动端调试 - UC浏览器开发者版 - WIFI

    Chrome  功能特性 支持PC或Pad设备,实时调试手机网页 DOM.CSS.JS调试 多功能面板满足多种调试需求 1   准备工作 保证手机与PC处于同一个无线网段. 下载Android平台的U ...

  7. 网络协议学习笔记(八)DNS协议和HttpDNS协议

    概述 上一篇主要讲解了流媒体协议和p2p协议,现在我给大家讲解一下关于DNS和HttpDNS的相关知识. DNS协议:网络世界的地址簿 在网络世界,也是这样的.你肯定记得住网站的名称,但是很难记住网站 ...

  8. XCTF(Web_php_unserialize)

    拿到题目,是个这, 我们来一波代码审计 1 <?php 2 class Demo { 3 private $file = 'index.php'; 4 public function __con ...

  9. Python向mysql数据库插入数据

    一.向表tcolor中插入数据的主要流程如下: import datetimeimport pymysql.cursorsconnection = pymysql.connect(host='loca ...

  10. 通过CVE-2021-43297漏洞在Apache Dubbo<=2.7.13下实现RCE

    目录 0 前言 1 找源头 1.1 找到触发点 1.2 可用的gadget 1.3 向上推触发点 2 构造poc 2.1 开启HttpServer 2.2 hessian2序列化过程简述 3 poc ...