import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; class Solution {
List<Integer> list = new ArrayList<>();
int primeNum = 0;
int[] fa;
int[] rank;
int[] map ; public static void main(String[] args) {
Solution solution = new Solution();
int cnt = solution.largestComponentSize(new int[]{
12377,95569,53366,10979,43909,40213,22501,359,96269,82847,85829,81154,43423,2801,97049,30053,72049,84779,17659,34033,49663,10159,61283,91771,22153,93991,8779,10357,89213,2791,55465,21061,9017,44777,77876,67343,64661,28631,20107,23557,10201,86737,4534,31481,83761,8977,59743,3659,4479,42577,2011,94063,59233,69777,31957,4909,82633,70709,72977,52973,74216,93109,37328,5591,77323,91857,36259,42743,76739,94697,88339,14801,39982,59473,26153,75689,55201,12293,14669,94819,36545,33403,16183,809,12451,20602,52354,54476,51421,53267,25589,45869,13829,90821,37547,52951,80943,33329,48989,11483,21548,75323,32987,51503,16987,89911,54589,74821,25763,34283,23977,46589,87023,36979,40057,43159,12763,29339,41521,85823,57029,69259,18119,27947,97561,54669,63377,69739,72367,27793,57373,79757,30187,83,83089,47527,69899,43786,26951,84278,36721,58207,81773,60283,79641,29483,87797,76313,30236,54359,16007,99371,44501,42649,14673,95789,31907,66049,93745,93985,4591,12813,5813,89767,41045,3607
});
System.out.println(cnt);
} public int largestComponentSize(int[] nums) {
pre();
int cnt1 = 0;
for (int num : nums) {
int tmp = num;
if( num == 1){
cnt1=1;
continue;
}
List<Integer> primes = new ArrayList<>();
for (int i = 0; i < primeNum && list.get(i) <= tmp && map[tmp] == -1; i++) {
int p = list.get(i);
boolean find = false;
while (tmp % p == 0) {
tmp = tmp / p;
find = true;
}
if (find) {
primes.add(i);
}
}
int set0 = map[tmp]>-1?map[tmp]:primes.get(0);
rank[find(set0)]++;
for (int j = 0; j < primes.size(); j++) {
int set = primes.get(j);
merge(set0, set);
} }
int max = 0;
for (int i = 0; i < list.size(); i++) {
int p = find(i);
if (rank[p] > max) {
max = rank[p];
}
}
return Math.max(max,1);
} public void merge(int set0, int set1) {
int p1 = find(set0);
int p2 = find(set1); if (p1 == p2) {
return;
} if (rank[p1] > rank[p2]) {
fa[p2] = p1;
rank[p1] += rank[p2];
} else {
fa[p1] = p2;
rank[p2] += rank[p1];
} } public int find(int set0) {
int tmp = set0;
while (fa[tmp] != tmp) {
tmp = fa[tmp];
}
int root = tmp;
while(fa[set0] != set0){
int p = fa[set0];
fa[set0] = root;
set0 = p;
}
return root;
} public void pre() {
primeNum = 0;
Arrays.fill(isprime,true);
for (int i = 2; i <= 100000; i++) {
if (isprime[i]) {
primeNum++;
list.add(i);
}
for(int j=i;j<=1_000_00;j+=i){
isprime[j] = false;
}
isprime[i] = true;
}
// System.out.println(primeNum);
fa = new int[primeNum];
rank = new int[primeNum];
for (int i = 0; i < primeNum; i++) {
fa[i] = i;
rank[i] = 0;
}
map = new int[100001];
Arrays.fill(map,-1);
for(int i = 0;i<list.size();i++){
map[list.get(i)] = i;
} } boolean[] isprime = new boolean[100001];
}

【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】的更多相关文章

  1. [Swift]LeetCode952. 按公因数计算最大组件大小 | Largest Component Size by Common Factor

    Given a non-empty array of unique positive integers A, consider the following graph: There are A.len ...

  2. 7-10 社交网络图中结点的“重要性”计算(30 point(s)) 【并查集+BFS】

    7-10 社交网络图中结点的"重要性"计算(30 point(s)) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络 ...

  3. PAT Advanced A1021 Deepest Root (25) [图的遍历,DFS,计算连通分量的个数,BFS,并查集]

    题目 A graph which is connected and acyclic can be considered a tree. The height of the tree depends o ...

  4. leetcode 886. 可能的二分法(DFS,染色,种类并查集)

    题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...

  5. QuantLib 金融计算——基本组件之 InterestRate 类

    目录 QuantLib 金融计算--基本组件之 InterestRate 类 InterestRate 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. Qua ...

  6. 【Java布局】FlowLayout布局时设定组件大小

    默认的JPanel中,采用的是FlowLayout布局 下面是api中的定义: JPanel(boolean isDoubleBuffered)           创建具有 FlowLayout 和 ...

  7. ios UITextView 计算文字内容大小

    先设置好 textView的内容文字,再调用以下代码,就能够得到文字内容的size,其中参数表示最大的size的尺寸,通常,高度应该不限制,宽度是控件的宽度. let newSize = statem ...

  8. 【转】Android绘制View的过程研究——计算View的大小

    Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...

  9. iOS计算缓存文件的大小

    //获取缓存文件路径 -(NSString *)getCachesPath{ // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesIn ...

  10. PHP计算某个目录大小的方法

    用PHP来计算某个目录大小的方法. PHP CURL session COOKIE  可以调用系统命令,还可以这样:  <?php function dirsize($dir) {  @$dh  ...

随机推荐

  1. 素数打表,洛谷P1217 [USACO1.5]回文质数 Prime Palindromes

    这道题的最后一个样例TLE(超时)了,判断素数的条件是 i*i<n 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include ...

  2. MySQL 将执行结果保存到文件

    1.  使用mysql的tee命令记录对mysql的操作过程 (1)第一种情况是在连接数据库的时候使用tee >mysql  -u root  -p  --tee=C:/log.txt      ...

  3. C++——编译和链接原理笔记

    我们在学习和开发C++程序中,理解编译和链接的原理至关重要.下面将学习一下C++程序是如何从源代码转换为可执行文件的过程,并结合示例代码进行说明.也是为了解开自己在刚学习C++的时候,编译时间长的疑惑 ...

  4. CF1859

    A 让 \(c\) 保存数组中所有最大的数,如果所有数都相等则 \(-1\). B 只需要记录每个序列的最小值和次小值,然后对次小值求前后缀和. C 枚举最大值 \(mx\),然后遍历 \(i:n\s ...

  5. 2023 CSP-J/S游记

    8.14 打了场 luogu 的 \(SCP\) ,给打没信心了. 8.16 普及模拟1 8.19 普及模拟2 8.22 普及模拟3 9.5 二调讲评结束后,和班主任说了考 \(CSP\) 的事情,就 ...

  6. NC19782 Tree

    题目链接 题目 题目描述 修修去年种下了一棵树,现在它已经有n个结点了. 修修非常擅长数数,他很快就数出了包含每个点的连通点集的数量. 澜澜也想知道答案,但他不会数数,于是他把问题交给了你. 输入描述 ...

  7. java 注解结合 spring aop 实现日志traceId唯一标识

    MDC 的必要性 日志框架 日志框架成熟的也比较多: slf4j log4j logback log4j2 我们没有必要重复造轮子,一般是建议和 slf4j 进行整合,便于后期替换为其他框架. 日志的 ...

  8. 【Unity3D】人机交互Input

    1 前言 ​ Input 是 Unity3D 中用于人机交互的工具类,用户可以调用其 GetKey.GetMousePosition.GetMouseButton.GetAxis.GetButton ...

  9. Java并发编程实例--4.控制线程打断

    Java提供了InterruptedException异常,当我们检测到线程被打断时可以抛出并在run()方法中进行捕捉. 本例中,我们将开发一个程序以实现根据文件名称在指定文件夹(包括其子目录)中搜 ...

  10. virtualapp启动流程源码分析

    virtualapp启动流程分析 1. 首先是启动本身,执行Vpp 的attachBaseContext @Override protected void attachBaseContext(Cont ...