[CF1325E] Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem
题目描述
You are given an array $ a $ of length $ n $ that has a special condition: every element in this array has at most 7 divisors. Find the length of the shortest non-empty subsequence of this array product of whose elements is a perfect square.
A sequence $ a $ is a subsequence of an array $ b $ if $ a $ can be obtained from $ b $ by deletion of several (possibly, zero or all) elements.
输入格式
The first line contains an integer $ n $ ( $ 1 \le n \le 10^5 $ ) — the length of $ a $ .
The second line contains $ n $ integers $ a_1 $ , $ a_2 $ , $ \ldots $ , $ a_{n} $ ( $ 1 \le a_i \le 10^6 $ ) — the elements of the array $ a $ .
输出格式
Output the length of the shortest non-empty subsequence of $ a $ product of whose elements is a perfect square. If there are several shortest subsequences, you can find any of them. If there's no such subsequence, print "-1".
样例 #1
样例输入 #1
3
1 4 6
样例输出 #1
1
样例 #2
样例输入 #2
4
2 3 6 6
样例输出 #2
2
样例 #3
样例输入 #3
3
6 15 10
样例输出 #3
3
样例 #4
样例输入 #4
4
2 3 5 7
样例输出 #4
-1
提示
In the first sample, you can choose a subsequence $ [1] $ .
In the second sample, you can choose a subsequence $ [6, 6] $ .
In the third sample, you can choose a subsequence $ [6, 15, 10] $ .
In the fourth sample, there is no such subsequence.
至多7个因子是什么条件?仔细分析,其实是说明这个数至多有两个不同质因数。
要求一个序列的所有数相乘为完全平方。也就代表任意一个质因数的次数之和为偶数。那么在某一个数中,如果有一个质因数出现了偶数次,那他很没用,出现了和没出现一个样,我们就可以不理他。然后现在要求选出来的序列每种质因数出现偶数次,会想到一件事。如果有一个数的质因数是 \((u,v)\),那么就一定需要一个含有 \(u\) 的数和一个含有 \(v\) 的数,然后往后又要推。最后一定是一个环。所以考虑最小环构图。
构图很简单,如果存在一个数 \(a_i=u\times v\)( \(u,v\) 为质数),那么就可以从 \(u\) 向 \(v\) 连一条无向边。如果一个数次数为奇数的质因数只有一个,那就把质因数 \(p\) 和 \(1\) 连边。
现在到了跑最小环。最小环问题解法可以使用 Floyd,但是这里完全行不通。注意到这里的边是无权的,对于最小环,有一种 \(O(n^2)\) 的算法。钦定一个一定在最小环上的点 \(x\),用它跑出一棵 bfs 树。然后对于一条不在树上的边 \((u,v)\),设点 \(x\) 到点 \(y\) 的最短路为 \(d_y\),那么如果点 \(x\) 和点 \((u,v)\) 要同时在最小环上,最小环长为 \(d_u+d_v+1\)。
或许有人会问,如果点 \((u,v)\) 在 bfs 树上的 lca 不为点 \(x\),怎么办?其实没关系,因为等我枚举 \(x\) 枚举到他们的 lca 时,自然就会把那个环算入了。
\(O(n^2)\) 的复杂度仍然不能接受,但发现不存在两个数 \(x,y\ge 1000\),同时又有连边。这说明,最小环上一定有一个点 \(x\le1000\)。所以我们枚举在环上的点时只用枚举小于等于1000的质数就行了。
复杂度 \(O(\frac{n\sqrt{n}}{logn})\)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e6+5;
int n,a[N],pri[M],hd[M],dp[M],q[M],l,r,ans=2000000000,e_num(1),pw[M];
vector<int>g[M];
struct edge{
int v,nxt,f;
}e[N<<1];
void add_edge(int u,int v)
{
e[++e_num]=(edge){v,hd[u]};
hd[u]=e_num;
}
void run(int x)
{
memset(dp,0,sizeof(dp));
dp[q[l=r=1]=x]=1;
for(int i=2;i<=e_num;i++)
e[i].f=0;
while(l<=r)
{
int k=q[l];
++l;
for(int i=hd[k];i;i=e[i].nxt)
{
if(!dp[e[i].v])
{
e[i^1].f=1;
dp[e[i].v]=dp[k]+1;
q[++r]=e[i].v;
}
else if(!e[i].f)
{
// printf("%d %d %d\n",x,k,e[i].v);
ans=min(ans,dp[k]+dp[e[i].v]-1);
}
}
}
}
int main()
{
for(int i=2;i<M;i++)
{
// printf("%d\n",i);
if(!pri[i])
{
for(int j=1;j*i<M;j++)
{
pri[j*i]=1;
if(j%i==0)
pw[j]=pw[j/i]^1;
if(!pw[j])
g[j*i].push_back(i);
}
for(int j=1;j*i<M;j++)
pw[j]=0;
}
}
// puts("hjhakioi");
// for(int i=1;i<M;i++)
// {
// printf("%d\n",i);
// for(int j=0;j<g[i].size();j++)
// printf("%d ",g[i][j]);
// putchar('\n');
// }
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
if(g[a[i]].size()==1)
{
add_edge(1,g[a[i]][0]);
add_edge(g[a[i]][0],1);
}
else if(g[a[i]].size())
{
add_edge(g[a[i]][0],g[a[i]][1]);
add_edge(g[a[i]][1],g[a[i]][0]);
}
else
{
printf("1");
return 0;
}
}
for(int i=1;i<=1000;i++)
run(i);
if(ans>n)
printf("-1");
else
printf("%d",ans);
}
[CF1325E] Ehab's REAL Number Theory Problem的更多相关文章
- [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环
E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...
- 题解-Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...
- Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)
题目: Mr. Panda is one of the top specialists on number theory all over the world. Now Mr. Panda is in ...
- Gym 101194A / UVALive 7897 - Number Theory Problem - [找规律水题][2016 EC-Final Problem A]
题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...
- A. Number Theory Problem
题目大意:计算小于2^n,且满足2^k-1并且是7的倍数的个数 思路:优先打表,数据不大,1e5,然后求个前n项和 #include<bits/stdc++.h> using namesp ...
- How to solve the SVDI SN Number Display Problem
Yesterday we have learn how to find the SVDI Serial Number, today one of customer from UK look our a ...
- Codeforces 1088E Ehab and a component choosing problem
Ehab and a component choosing problem 如果有多个连接件那么这几个连接件一定是一样大的, 所以我们先找到值最大的连通块这个肯定是分数的答案. dp[ i ]表示对于 ...
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem
E. Ehab and a component choosing problem 题目链接:https://codeforces.com/contest/1088/problem/E 题意: 给出一个 ...
- Codeforces Round #525 (Div. 2)D. Ehab and another another xor problem
D. Ehab and another another xor problem 题目链接:https://codeforces.com/contest/1088/problem/D Descripti ...
随机推荐
- C# QRCode二维码的解析与生成
已知一张二维码图片,怎么生成一张一模一样的图片出来? 最近有个项目,需要用到QRCode,之前只做过Datamatrix格式的,想着应该也是差不多的,于是就依葫芦画瓢,掏出我的陈年OnBarcode类 ...
- Codespaces个性化后台服务器配置指南
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 前文概览 在前文<浏览器上写代码,4核8G微软服 ...
- java多线程使用详解与案例,超详细
一.创建线程的方式 1.继承Thread类 让子类继承Thread线程类 子类必须重写Thread类的run方法 创建一个自己定义的线程对象 调用start()方法启动线程 //测试类 /** * 1 ...
- embed简介
go embed 是 Go 1.16 中引入的特性,它允许将文件嵌入到 Go 代码中,以便在运行时访问这些文件.这对于将静态资源(如 HTML.CSS.JavaScript 文件)直接嵌入到 Go 二 ...
- 使用 SQL 的方式查询消息队列数据以及踩坑指南
背景 为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息:同时点击详情后也能查到消息的整个轨迹. 消息列表 点击详情后查看轨迹 原理介 ...
- DeferredResult异步处理spring mvc Demo
一.概述 spring mvc同步接口在请求处理过程中一直处于阻塞状态,而异步接口可以启用后台线程去处理耗时任务.简单来说适用场景: 1.高并发: 2.高IO耗时操作. 二.Demo Spring M ...
- JavaScript动态更新数组
1.数组的创建var arrayObj = new Array(); //创建一个数组var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长 ...
- Kafka与RabbitMQ
一.什么是kafka,什么是rabbit Kafka是由Scala语言开发的一种分布式流处理框架,主要用于处理活跃的流式数据,以及大数据量的数据处理.它采用发布-订阅模型,支持消息的批量处理,数据 ...
- vue2和vue3使用echarts时无数据,怎么显示暂无数据图片或文字
一开始也经历了用v-if和v-show,v-show的话echarts还会留出暂无数据图片的位置,导致echarts变形,v-if在加载和不加载切换时,dom会获取不到:后来也是在网上找的方法,时间有 ...
- 3 分钟把高质量 AI 知识库 FastGPT 装进企业微信
FastGPT V4 已经上线,直接冲上 GitHub Trending. 如果你还不知道 FastGPT 是什么,可以先去看看作者的介绍 使用 FastGPT 构建高质量 AI 知识库 非常多的企业 ...