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\) ...
随机推荐
- C#进阶——从应用上理解异步编程的作用(async / await)
欢迎来到学习摆脱又加深内卷篇 下面是学习异步编程的应用 1.首先,我们建一个winfrom的项目,界面如下: 2.然后先写一个耗时函数: /// <summary> /// 耗时工作 // ...
- Calendar日期往后一天,一月等
import java.util.Date ; Date date=new Date();//取时间 System.out.println(date.toString()); ...
- 关于 cannot create Parameters: [] 报错问题的解决方法
其实在Sort类中添加无参构造就可以解决 我自己写的是Sort类,其它情况得视你们自己写的类决定 至于为什么也不是很清楚
- YBT 1633:【例 3】Sumdiv
http://ybt.ssoier.cn:8088/problem_show.php?pid=1633 A^B 快速幂求结果,所有约数和,可以通过组合来进行得到. 技巧,通过递归得到1~n次的和.su ...
- MongoDB之几种情况下的索引选择策略
一.MongoDB如何选择索引 如果我们在Collection建了5个index,那么当我们查询的时候,MongoDB会根据查询语句的筛选条件.sort排序等来定位可以使用的index作为候选索引:然 ...
- PAT 乙级 1004. 成绩排名 (20)(C语言描述)
读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...
- 【reverse】逆向2 寄存器与内存
[reverse]逆向2 寄存器与内存 1.通用寄存器 主要用途其实没必要记下来,因为只是CPU建议你这么做. 寄存器需要按照顺序被下来 32位就是可以存32个0或1 所以存储范围就是0-0xFFFF ...
- CentOS 8安装Docker报错(Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.)
CentOS8安装docker和docer-conpose 报错如下Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires contain ...
- gin框架中中间件的编写与使用
概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...
- Go 指针,标识符命名规范及关键字
#### Go 指针,标识符命名规范,关键字,运算符回顾了一下之前写的文章,以及考虑到后期的内容较多, 从这篇开始逐渐增加文章内容; 这篇我们主要学习一Go 中的指针,标识符关键字以及运算符##### ...