Description:

给定一个序列\(a\),要求选出最多的序列元素并保证两两元素的乘积不为立方数

Solution:

我们考虑哪些因子是有用的,如果一个因子的指数\(>3\),我们可以将他化简为\(\text{%3}\)后的指数,这样不影响他找对应的不能一起选的,那我们先将所有数化简并分类(map一下),找出他们的补数(不能一起选的数),然后贪心的选择最大的,这一步需要质因数分解,但是\(10^{10}\)太大了,其实我们只用分解\(10^{\frac{10}{3}}\),剩下的因子只有几种情况,<1>只剩一个因子,<2>剩下两个因子,可能是完全平方数也可能不是,这些情况我们均可确定简数以及补数。注意:如果一个数与他的补数相等,我们只能选一个
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<map>
using namespace std;
const int MAXX=3000;
const int MAXN=100010;
map<long long ,int >num;
map<long long ,bool >vis;
int prime[MAXN],v[MAXN];
int n,tot,ans;
long long a[MAXN],b[MAXN];
inline void init(){
for(int i=2;i<=MAXX;++i){
if(!v[i]){
prime[++tot]=i;
v[i]=i;
}
for(int j=1;j<=tot;++j){
if(i*prime[j]>MAXX||v[i]<prime[j])break;
v[i*prime[j]]=prime[j];
}
}
}
inline void solve(long long x,int pos){
long long u=1;
long long v=1;
for(int i=1;i<=tot;++i){
if(x%prime[i]==0){
long long cnt=0;
while(x%prime[i]==0){
x/=prime[i];
cnt++;
}
cnt%=3;
if(cnt==1){
u*=prime[i];
v*=prime[i]*prime[i];
}
if(cnt==2){
u*=prime[i]*prime[i];
v*=prime[i];
}
}
if(x==1)break;
}
if(x>1){
long long t=(long long)sqrt(x);
u*=x;
if((t*t)==x)v*=t;
else v*=x*x;
}
a[pos]=u;
b[pos]=v;
num[u]++;
}
int main(){
init();
scanf("%d",&n);
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1;i<=n;++i)solve(a[i],i);
for(int i=1;i<=n;++i){
if(!vis[a[i]]){
vis[a[i]]=1;
vis[b[i]]=1;
if(a[i]==b[i])ans++;
else ans+=max(num[a[i]],num[b[i]]);
}
}
cout<<ans<<endl;
return 0;
}

AtCoderAGC003D Anticube的更多相关文章

  1. 【agc003D】Anticube

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

  2. Agc003_D AntiCube

    传送门 题目大意 给定$N$个数,求一个最大的子集,使得任意两两的乘积不是一个完全立方数. $n\leq 10^5 A_i\leq 10^{10}$ 题解 考虑两两乘积为$x^3$,由于$x^3\le ...

  3. AtCoder Grand Contest 003 D - Anticube

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

  4. AT2004 Anticube

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

  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. hadoop-09-安装资源上传

    hadoop-09-安装资源上传 在/software/www/html 下面上传 ambari  HDP  HDP-UTILS-1.1.0.21 文件,之后解压:

  2. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)

    ndk编译C++.提示找不到头文件(ndk-build error: string: No such file or directory) 被这个问题弄得愁眉苦脸啊.心想为啥一个string都找不到呢 ...

  3. Eclipse中项目进行发布到Tomcat中的位置

    Eclips配置tomcat默认是发布到.metadate\plugins\目录下的,wtpwebapps.这样在实际的tomcat目录下,就找不到发布的项目.我们可以自己进行设置,在控制栏中找到se ...

  4. 获取当前最上层controller

    - (UIViewController *)topViewController { UIViewController *resultVC; resultVC = [self _topViewContr ...

  5. SharePoint 修改完或制作完一定要发布

    设置了匿名访问但是网站就是需要登录,找了很多问题. 首先想到的映射问题,然后努力检查,最后把代码删掉,然后把站删掉,最后测试出来问题. 点击上方[网站设置] 把修改过的文件发布. 母版也和布局页 一定 ...

  6. jquery重新渲染的问题

    今天动态加载了一个a标记,使他被渲染为linkbutton 在拼该a标记串时,将class属性设置为:class='easyui-linkbutton' ,然而却没有看到linkbutton的效果,原 ...

  7. 1x1卷积核作用

    1. 实现跨通道的交互和信息整合 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量! 对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把 ...

  8. NodeJS学习笔记 (30)定时器-timers

    https://github.com/chyingp/nodejs-learning-guide

  9. java uploadify 上传组件使用方法

    !!!声明 1-3 是jsp页面所写内容   文中需要的util  参见百度云 http://pan.baidu.com/s/1kV0gqBt   如已失效 请加QQ1940978083 1.首先引入 ...

  10. Android通过XML来定义Menu

    直接在代码中添加菜单项,给菜单项分组等,这是比较传统的做法,它存在着一些不足.比如说,为了响应每个菜单项,我们需要用常量来保存每个菜单项的ID等.为此,Android提供了一种更好的方式,就是把men ...