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) 数论+图论 求最小环的更多相关文章

  1. 题解-Ehab's REAL Number Theory Problem

    Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...

  2. codeforces.com/contest/325/problem/B

    http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...

  3. https://vjudge.net/contest/321565#problem/C 超时代码

    #include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. BAT脚本编写要点_特殊字符

    BAT脚本编写要点(1)_特殊字符 分类: 其他 2011-03-20 00:58 5621人阅读 评论(0) 收藏 举报 脚本cdatecmdtreesystem 1. 点 与echo连用,作用是换 ...

  2. Linux下搭建接口自动化测试平台

    前言 我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧! 需要在Linux上提前准备的环境(下面是本人搭建时的环境): 1,Python 3.6.8 (可参考 ...

  3. 【Java】关键字 和 保留字

    Java的关键字[Keyword]和 保留字[Reserved word] 官方描述: https://docs.oracle.com/javase/tutorial/java/nutsandbolt ...

  4. pandas basic cheatsheet

    "胖的要死"是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. 有多大?这篇 ...

  5. 【Jenkins】插件更改国内源

    最近调试脚本,本机安装了Jenkins,但是安装插件时一直失败.更改升级站点也不生效,究其原因是因为default.json中插件下载地址还https://updates.jenkins.io,升级站 ...

  6. Windows DC域控由server08r2升级至server2016测试

    测试环境 原DC: csctest.com CSCDC01 192.168.100.1 server08r2 CSCDC02 192.168.100.2 server08r2 要求: 原两台旧主机均更 ...

  7. MySQL不香吗,为什么还要有noSQL?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式专题的第14篇文章,我们一起来看看NoSQL数据库. 其实我很早就想写写分布式数据库相关的文章,既是我现在正在学习的,也是我很感 ...

  8. [Asp.Net Core] Blazor Server Side 项目实践 - 切换页面时保留状态

    前言: 这是 项目实践系列 , 算是中高级系列博文, 用于为项目开发过程中不好解决的问题提出解决方案的. 不属于入门级系列. 解释起来也比较跳跃, 只讲重点. 因为有网友的项目需求, 所以提前把这些解 ...

  9. for嵌套setTimeout的心得

    export default { data() { return { dialogList: [] } }, created() { this.setList() }, methods: { setL ...

  10. Ubuntu中安装Hadoop

    安装前 1,更新apt sudo apt-get update   会让你输入密码(自己登录Ubuntu的时候设置的),输入密码不会显示在终端面板上,确定自己敲对之后点回车就行. 2,安装SSH服务器 ...