传送门

题目大意

给定$N$个数,求一个最大的子集,使得任意两两的乘积不是一个完全立方数。

$n\leq 10^5 A_i\leq 10^{10}$

题解

考虑两两乘积为$x^3$,由于$x^3\leq 10^{20}$,那么$x\leq 10^{\frac{20}{3}}$,那么$x$最多出现一个超过$10^{\frac{10}{3}}$的质因子,且这一质因子不会超过$10^{\frac{20}{3}}$。又由于$A_i\leq 10^{10}$,所以至多出现一个$> 10^5$的质因子,由于$x^3$由两个$A_i$相乘,那么$x$一定不会出现超过$>10^5$的质因子。

所以$x$由$[2,10^5]$内的质数幂构成,且$[10^{\frac{10}{3}},10^5]$内质数至多出现$1$个,且指数不超过$1$。

那么考虑筛出$10^5$以内的质数。

对于每一个$A_i$我们直接暴力枚举$<10^{\frac{10}{3}}$的质数(大约$300$个左右),直接筛掉,过滤掉质数是$3$的倍数的质因子,记录它由哪几个剩下的质因子构成,并将它每一个质因子质数模$3$的余数($1$或$2$)压进一个二进制状态中。对于剩下的数,如果它不为$1$,我们判断它是不是一个$<10^5$的质数或者一个$<10^5$的质数的平方,如果不是,那么它一定无法和别的任何一个数组成立方数,因为它肯定是一个$>10^5$的质数。否则,我们直接把这个稍大的质数当做之前过滤的数一样压入状态中。

对于两个过滤完的质因子的集合完全相同的数,它们能组成立方数当且仅当它们的二进制状态是恰好相反的,这样就能凑出每一个质因子的质数都是$3$的倍数。

然后就可以直接按照质因子集合放在一起,记录每一种状态和它的补集包含的数的数量,选集合大小更大的那一堆即可。

复杂度$O(n\log n+300n)$。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 300020
#define MAXN 100000
using namespace std;
int n,m,sz[M],K[M],res,mp[200002];
int od[M],ans; LL p[M],pri[M],t[M]; bool isp[M];
bool cmp(int x,int y){return t[x]<t[y];}
LL read(){
LL nm=0; char cw=getchar(); for(;!isdigit(cw);cw=getchar());
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0'); return nm;
}
int main(){
memset(isp,true,sizeof(isp));
for(int i=2;i<MAXN;i++){
if(!isp[i]) continue; pri[++m]=i;
for(int j=(i<<1);j<MAXN;j+=i) isp[j]=false;
}
n=read();
for(int j,i=1;i<=n;i++){
for(p[i]=read(),K[i]=sz[i]=0,j=t[i]=1;j<=308;j++){
if(p[i]%pri[j]) continue; int cnt=0;
while(!(p[i]%pri[j])) p[i]/=pri[j],++cnt; cnt%=3;
if(cnt) K[i]|=((cnt&1)<<sz[i]),sz[i]++,t[i]*=pri[j];
}
if(p[i]>1ll){
if(p[i]<MAXN) K[i]|=(1<<sz[i]),sz[i]++,t[i]*=p[i];
else {
LL qq=sqrt(p[i]);
if(qq*qq!=p[i]) ans++,i--,n--;
else sz[i]++,t[i]*=qq;
}
}
}
for(int i=1;i<=n;i++) od[i]=i; sort(od+1,od+n+1,cmp);
for(int l=1,r;l<=n;l=r+1){
for(r=l;r<n&&t[od[r]]==t[od[r+1]];r++);
if(t[od[l]]==1){ans++;continue;}
int maxn=(1<<sz[od[l]])-1;
for(int i=l;i<=r;i++) mp[K[od[i]]]++;
for(int i=l;i<=r;i++){
int x=K[od[i]],ot=(maxn^K[od[i]]);
if(mp[x]>=mp[ot]) ans+=mp[x],mp[x]=mp[ot]=0;
}
} printf("%d\n",ans); return 0;
}

Agc003_D AntiCube的更多相关文章

  1. AtCoder Grand Contest 003 D - Anticube

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_d 题目大意: 给定\(n\)个数\(s_i\),要求从中选出尽可能多的数,满足任意两个数之积 ...

  2. 【agc003D】Anticube

    Portal --> agc003D Description 给你\(n\)个数,要从里面选出最多的数满足这些选出来的数中任意两个数的乘积都不是立方数 Solution (为什么感觉最近这种解法 ...

  3. AT2004 Anticube

    https://www.zybuluo.com/ysner/note/1304774 题面 给定\(n\)个数\(s_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数. \(n\leq ...

  4. AtCoderAGC003D Anticube

    Description: 给定一个序列\(a\),要求选出最多的序列元素并保证两两元素的乘积不为立方数 Solution: 我们考虑哪些因子是有用的,如果一个因子的指数\(>3\),我们可以将他 ...

  5. Solution -「AGC 003D」「AT 2004」Anticube

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数.   \(n\le10^5\) ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. AtCoder Grand Contest 003

    AtCoder Grand Contest 003 A - Wanna go back home 翻译 告诉你一个人每天向哪个方向走,你可以自定义他每天走的距离,问它能否在最后一天结束之后回到起点. ...

  8. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  9. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

随机推荐

  1. mysql-proxy做客户端连接转发【外网访问内网mysql】

    功能 用于外网客户端连接内网的MySQL,将此工具安装在中转服务器上. 软件版本 mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz 简单的配置过程 解压后有 ...

  2. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  3. 为什么是kafka(二)

    回答几个网友提出的问题,不清楚的能够看上一篇内容. 1.  kafka的删除策略应该怎么配置?为了提升性能.我是不是应该1小时删除一次消费过的数据. 全然能够依据磁盘大小配置.仅仅要磁盘足够用,全然不 ...

  4. php的json_encode不兼容JSON_UNESCAPED_UNICODE

    //php的json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案 function _json_encode($value) { if (version_compare( ...

  5. PHP中ob系列函数讲解(浏览器缓存技术) (转)

    Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况. 输出控制函数不对使用 header() 或 setcooki ...

  6. ABAP 内表

    定义内表 1. 先声明表结构, 再根据表结构定义内表.   TYPES: BEGIN OF w_itab, a(10), b(10), END OF w_itab. DATA: itab1 type ...

  7. django 异步任务实现及Celery beat实现定时/轮询任务

    Celery定时任务 requirements celery==3.1.25 异步任务 django-celery==3.2.2 定时任务管理包 redis==2.10.6 django-redis- ...

  8. 使用阿里云的PyPI源

    方法1:(1)创建pip.conf文件 (2).编辑如下内容 [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] ...

  9. 【WEB】高并发Web服务的演变-节约系统内存和CPU

    目前主流浏览器通常可以存在2-6个并发. 连接和请求,占据了服务器的大量CPU和内存等资源.在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要. 缓解“高并发”的压力的手段. 一. W ...

  10. Linux:进程管理

    Linux:进程管理 进程间通信 文件和记录锁定. 为避免两个进程间同时要求访问同一共享资源而引起访问和操作的混乱,在进程对共享资源进行访问前必须对其进行锁定,该进程访问完后再释放.这是UNIX为共享 ...