[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<=10^6\)
- \(a_i\) 最多只有7个因数
题目要求在这个数列找到一个最短的子数列,子数列的所有的数相乘是一个完全平方数。
题解:
- 这个题对于 \(x^{3}\) 应该等价于 \(x\) ,其实就是可以除去 \(a_i\)中的所有的平方项,显而易见,这个并不影响答案。
- 因为 \(a_i\) 最多只有7个因素,由素数唯一分解定理可得每一个元素最多 2 个质因子。
- 所以删去平方项之后,每一个元素就会要么是两个素因子相乘,要么就是一个素因子。
- 此时,我们把每一个素因子当初一个节点,如果一个素数是由哪两个素因子相乘,那就可以连一条边,如果只有一个元素,把1也当作素因子看做一个节点。
- 这样就变成一个图论问题,求无向无权图的最小环。
- 直接暴力每一个点都是起点,因为每一个元素至少有一个素因子是小于1000,所以这个时候我们遍历从1到1000每一个值都是起点,就可以遍历到每一个元素,在这里求最小环即可。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e6+10;
struct node{
int v,nxt;
node(int v=0,int nxt=0):v(v),nxt(nxt){}
}e[maxn];
int head[maxn],cnt,isp[maxn],v[maxn],m,f,ans,a[maxn],num;
void init(){//只需要求1000以内的素数即可
cnt=f=num=0,ans=inf;
memset(head,-1,sizeof(head));
for(int i=2;i<1000;i++){
if(!v[i]){
isp[m++]=i;
v[i]=i;
}
for(int j=0;j<m;j++){
if(v[i]<isp[j]||i*isp[j]>=1000) break;
v[i*isp[j]]=isp[j];
}
}
}
void add(int u,int v){
a[++num]=u,a[++num]=v;//求出所有的素数
e[cnt]=node(v,head[u]);
head[u]=cnt++;
e[cnt]=node(u,head[v]);
head[v]=cnt++;
}
void judge(int x){
int div[5],tot=0;
for(int i=0;i<m;i++){
if(x%isp[i]==0){
while(x%(isp[i]*isp[i])==0) x/=isp[i]*isp[i];
if(x%isp[i]==0) div[++tot]=isp[i],x/=isp[i];
}
}
if(tot==0&&x==1) {f=1;return ;}
if(x>1) div[++tot]=x;
if(tot==1) add(1,div[1]);
else add(div[1],div[2]);
}
int d[maxn];
typedef pair<int,int>pii;
void bfs(int s){
for(int i=1;i<=num;i++) d[a[i]]=inf;//只需要初始化在图中的素数
d[s]=0;queue<pii>que;
que.push(pii(s,0));
while(!que.empty()){
pii u=que.front();que.pop();
for(int i=head[u.first];~i;i=e[i].nxt){
int v=e[i].v;
if(v==u.second) continue;
if(d[v]==inf){
d[v]=d[u.first]+1;
que.push(pii(v,u.first));
}
else ans=min(ans,d[u.first]+d[v]+1);
}
}
}
int main(){
init();int n;
scanf("%d",&n);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);judge(x);
}
sort(a+1,a+1+num);
num=unique(a+1,a+1+num)-a-1;
if(f) {printf("1\n");return 0;}
bfs(1);
for(int i=0;i<m;i++) bfs(isp[i]);
if(ans==inf) printf("-1\n");
else printf("%d\n",ans);
return 0;
}
[E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环的更多相关文章
- 题解-Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...
- codeforces.com/contest/325/problem/B
http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...
- https://vjudge.net/contest/321565#problem/C 超时代码
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...
- http://codeforces.com/contest/610/problem/D
D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- http://codeforces.com/contest/612/problem/D
D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- http://codeforces.com/contest/536/problem/B
B. Tavas and Malekas time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- http://codeforces.com/contest/535/problem/C
C. Tavas and Karafs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- http://codeforces.com/contest/838/problem/A
A. Binary Blocks time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- http://codeforces.com/contest/402/problem/E
E. Strictly Positive Matrix time limit per test 1 second memory limit per test 256 megabytes input s ...
随机推荐
- Docker命名空间
命名空间 命名空间( namespace )是 Linux 内核的一个强大特性,为容器虚拟化的实现带来极大便利,利用这 特性,每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系 ...
- CentOS 7 yum安装 k8s 创建Pod一直处于ContainerCreating状态 问题解决
问题描述 使用CentOS7的 yum 包管理器安装了 Kubernetes 集群,使用 kubectl 创建服务成功后,执行 kubectl get pods,发现AGE虽然在不断增加,但状态始终不 ...
- 表字段或表名出现Mysql关键字或保留字导致问题 Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have
MySQL 5.7使用的关键字和保留字 https://dev.mysql.com/doc/refman/5.7/en/keywords.html 当我们建表的时候如果使用了关键字或者保留字,则在执行 ...
- unity使用Animator做一个简单的动画
1.在unity的物体上添加Animator组件 2.在Project下的Assets下添加Animator Controller 3.在Animator Controller添加动作 4.在动作之间 ...
- ASE team work proposal
Hi,我们是Azure Wrapper,欢迎来到我们的blog~我们将在这里记录下ASE课程的滴滴点点,美妙的旅程就要开始啦! 以下是每位队员提交的关于ASE 团队项目的提议: 朱玉影: 随着信息时代 ...
- FZU 2150
题目大意:有一个矩阵,"."表示石头,"#",表示小草,有两个人,可以在任意两个位置点燃小草,小草可以上下左右蔓延,蔓延一次的时间为1,问所有蔓延完所有小草所花 ...
- el-tab-pane label的文字内容怎样设间距
el-tab-pane label的文字内容怎样设间距 问题描述: 在使用element-ui的el-tab-pane做标签页时,label属性的位置与样式不能通过style样式直接解决 百度后几乎没 ...
- leetcode-0543 二叉树的直径
题目地址https://leetcode-cn.com/problems/diameter-of-binary-tree/ 递归+BFS(暴力解法) 我们可以考虑在每个节点时,都去计算该节点左子树和右 ...
- pytorch 中交叉熵损失实现方法
- java算法-二分法查找实现
什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别 ...