传送门

  • 题目:
  • 思路:
    如果一个数xxx有三个不同的质约数p1,p2,p3p_1, p_2, p_3p1​,p2​,p3​,那么这个数至少有8个约数。
    这是因为gcd(p1,p3)=1,gcd(p2,p3)=1gcd(p_1,p_3)=1, gcd(p_2, p_3)=1gcd(p1​,p3​)=1,gcd(p2​,p3​)=1,那么gcd(p1∗p2,p3)=1gcd(p_1*p_2, p_3)=1gcd(p1​∗p2​,p3​)=1,也就是说不可能存在两个质约数的乘积=xxx(否则就会有p3∣(p1∗p2),gcd(p1∗p2,p3)p_3|(p_1*p_2),gcd(p_1*p_2, p_3)p3​∣(p1​∗p2​),gcd(p1​∗p2​,p3​)),再加上1和xxx就至少有8个约数了。
    所以题目的意思是说给出的aia_iai​都最多有两个质约数。
    所谓完全平方数xxx,可以理解为对xxx进行完全质因子分解,每个质因子的出现次数都为偶次。
    对aia_iai​进行完全质因子分解,只考虑出现奇数次的质因子,由于题目保证aia_iai​最多只有两个质约数,也就是出现奇数出的质因子最多只有两个。构造一个图,点的编号都是质数,边权是对应的aia_iai​。xxx分解完后可能为1、1个质因子p、2个质因子p,q。在图中的连接情况对应的是:(1,1)、(1,p)、(p,q),这样找到图中的最小环,环内点的数目即答案。因为环内每个点都出现了两次,这样就满足了完全平方数。
    (1)自环(1,1),或者两个点被连接了多次,这些情况可以直接判断答案。
    (2)否则就是对于两个点只被直接连接一次的图,枚举1~sqrt(max(ai))1~sqrt(max(a_i))1~sqrt(max(ai​))为起点bfs求最小环。
    注意:若分解为两个质因子p和q,那么p∗q≤max(ai)p*q≤max(a_i)p∗q≤max(ai​),即图中最大的质数为sqrt(max(ai))sqrt(max(a_i))sqrt(max(ai​)),只从≤sqrt(max(ai))≤sqrt(max(a_i))≤sqrt(max(ai​))的质数为起点就可以找到答案。
    自测样例:
6
2 3 5 6 12 40

对应的图:

  • ac代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int x, n, ans = INT_MAX;
struct node{int nxt, eid;
};
vector<node> edges[maxn];
map<pair<int, int>, int> mp;
bool vis[maxn];
int dis[maxn];
queue<int> q;
void Div(int x, int id)
{int p = 1, q = 1;for(int i = 2; i*i <= x; i++){if(x%i==0){int num = 0;while(x%i==0) num++, x/=i;if(num%2){if(p==1) p = i;else q = i;}}}if(x!=1){if(p==1) p = x;else q = x;}if(p==1&&q==1){ans = min(ans, 1);return ;}mp[{p, q}]++;if(mp[{p, q}]>=2){ans = min(ans, 2);return ;}edges[q].push_back({p, id});edges[p].push_back({q, id});
}
int bfs(int s)
{if(edges[s].empty()) return INT_MAX;memset(vis, false, sizeof vis);//记录边是否访问过memset(dis, 0, sizeof dis);while(!q.empty()) q.pop();q.push(s);dis[s] = 1;//标记起始点已被访问while(!q.empty()){int now = q.front(); q.pop();for(int i = 0; i < edges[now].size(); i++){int nxt = edges[now][i].nxt, eid = edges[now][i].eid;if(vis[eid]) continue;//边不回返if(dis[nxt]) return dis[now]+dis[nxt]-1;vis[eid] = true;q.push(nxt);dis[nxt] = dis[now]+1;}}return INT_MAX;//未成环
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &x);Div(x, i);}if(ans!=INT_MAX) printf("%d\n", ans);else{for(int i = 1; i <= 1000; i++) ans = min(ans, bfs(i));if(ans==INT_MAX) ans = -1;printf("%d\n", ans);}return 0;
}

【CF1325E】 Ehab's REAL Number Theory Problem(思维+最小环bfs)相关推荐

  1. 图论 + 数论 ---- CF1325E E. Ehab‘s REAL Number Theory Problem (约数个数 + 枚举 + bfs找最小环)[从图结构优化搜索]

    题目链接 题目大意: 给你nnn个数,每个数保证约数个数不超过777个.问你从中选出若 干个数的乘积是完全平方数,最少要选择多少个数?,不存在输出-1. 题目思路: 1.每个数约数不超过7个→\rig ...

  2. Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每个数的因子个数不超过777个,选出最少的数使其乘积为平方数. n≤1e5n\le 1e5n≤1e5 思路: 由于因子不超过777个,所以由约 ...

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

  4. 【Codeforces Round #525(Div. 2)】Ehab and another another xor problem(思维+异或)

    题目链接 D. Ehab and another another xor problem time limit per test 1 second memory limit per test 256 ...

  5. NUMTRYE - Number Theory (Easy)

    NUMTRYE - Number Theory (Easy) Hard 版本就是用 pollard_rho 分解质因子. f(n)=∏(pi2ei+1+1)f(n) = \prod(p_i ^{2e_ ...

  6. 2016级算法第二次上机-F.ModricWang's Number Theory II

    891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...

  7. A Number Theoretical Problem

    题目连接: A Number Theoretical Problem 大致题意: 给出一个整数x 和 质数p, 让你找到一个整数y满足 (x * y) % p == 1. 如果找到则输出y % p的结 ...

  8. Segment 2:Introduction Number Theory——Fermat and Euler【费马定理和欧拉定理】

    Segment 2:Introduction Number Theory--Fermat and Euler[费马定理和欧拉定理] 这是整个数论简介的内容,下面是这个的主目录,其链接为:https:/ ...

  9. Elliptic Curves Number Theory And Cryptography——pairing learning

    <Elliptic Curves Number Theory And Cryptography 2n>中Example 11.5, magma脚本: clear; q:=7; Fq:=GF ...

  10. concrete maths ch4 number theory

    ch4 number theory 数论研究正数的性质 1.整除 gcd lcm 扩展欧几里得. 整除求和\(\sum_{n|m}\)的几个公式.ch2的知识会很有用. 2.质数 Fundamenta ...

最新文章

  1. php zblog 侧边栏样式_zblogphp版如何实现导航栏下拉框
  2. 通过RS232发送和接收短信(二)
  3. mysql编译安装 rpm安装_Linux常用工具小结:(2) Mysql的rpm安装和编译安装
  4. kubernetes mysql ip_弄明白kubernetes中的“三种IP”
  5. 清北学霸的书单居然那么有讲究?看看你比学霸少看了哪些书......
  6. Flowable快速工作流脚手架_Jsite角色授权不显示
  7. post方法就返回了一个string字符串前台怎么接_LoadRunner脚本编写教程Getamp;Post
  8. Docker安装QuestDB教程
  9. 不错的网络协议栈測试工具 — Packetdrill
  10. 高斯求和1+2+3+······+n-1+n=?
  11. icloudbypassca工具win版_Photoshop插件提示无法加载扩展,因为它未经正确签署的解决办法(win/mac)...
  12. 第一周golang学习:--基本数据类型与string字符串类型之间的转换
  13. JAVA项目案例详解带代码
  14. 阿里P7晒出1月工资单:狠补了这个,真香...
  15. 基于RV1126 Video分析-----驱动各模块总览
  16. 多个图片合并为一个压缩包下载
  17. matlabnbsp;蠓虫分类问题nbsp;amp;n…
  18. 联想LJ2400激光打印机开机4灯闪烁维修分析
  19. 完全免费的OCR文字识别软件
  20. pdf阅读器(福昕pdf阅读器电脑版)免安装pjb

热门文章

  1. C#中Dictionary的用法及用途
  2. Silverlight 3.0正式版RTW的发布日期
  3. android取消自动获取焦点,Android 如何让EditText不自动获取焦点 (转)(示例代码)...
  4. android封装全局调用的toast_自定义Toast,解决系统Toast存在的问题
  5. tftp路由器刷机修复工具_魅族路由器极速版刷老毛子固件教程
  6. ironpython怎么编译_将IronPython WPF项目编译为
  7. python中函数包括_python中有哪些函数
  8. Java—以当前系统时间生成随机数
  9. Forrester告诫CIO们:谨慎应用区块链网络
  10. Waymo已经开始绘制亚特兰大地图数据,自动驾驶汽车路测地点又添新城