[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 ...
随机推荐
- Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置
最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...
- 004-流程控制-C语言笔记
004-流程控制-C语言笔记 学习目标 1.[掌握]关系运算符和关系表达式 2.[掌握]逻辑运算符和逻辑表达式 3.[掌握]运算符的优先级和结合性 4.[掌握]if-else if-else结构的使用 ...
- AJ学IOS(16)UI之XIB自定义Cell实现团购UI
AJ分享,必须精品 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XI ...
- [总结]最近公共祖先(倍增求LCA)
目录 一.定义 二.LCA的实现流程 1. 预处理 2. 计算LCA 三.例题 例1:P3379 [模板]最近公共祖先(LCA) 四.树上差分 1. 边差分 2. 点差分 3. 例题 一.定义 给定一 ...
- JMock2入门
说明:学习JMock官网的Getting Started的笔记 例子:为测试publish/subscribe发布/订阅信息系统的publisher(发布者),mock subscriber(订阅者) ...
- webWMS开发过程记录(四)- 整体设计
分层 View(Servlet/Action/JSP)--> Service(接口/实现类) --> Dao(接口/实现类) 所用技术 Struts2 Hibernate Spring J ...
- 【spring 国际化】springMVC、springboot国际化处理详解
在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...
- jQuery+ajax实现滚动到页面底部自动加载图文列表效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Vm安装虚拟机并使用net模式连接外网
Vm安装虚拟机并使用net模式连接外网 最近想搭建一个maven私服和阿波罗配置中心一切准备就绪时 发现本地vm虚拟机无法连接外网,嗯 ~ ~ ,一句cnm不由从嘴里崩了出来.没办法,只能配置一下了接 ...
- Numpy学习-(2)
我学习numpy过程的记录 1. 切片和索引 (1) 两种切片方式示例: (2) 多维数组: import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5 ...