报告错误
如果你发现该网页中存在错误/显示异常,可以从以下两种方式向我们报告错误,我们会尽快修复:
- 使用 CS Club 网站错误 为主题,附上错误截图或描述及网址后发送邮件到 286988023@qq.com
- 在我们的网站代码仓库中创建一个 issue 并在 issue 中描述问题 点击链接前往Github仓库
题目描述
题目中首先会给两个数分别是N和M
然后题目中会再给N个数
求1到M中与N互质的数。
思路
先将题目中的N个数分解质因数,排除掉每一个质因数的数,这样子剩下的数就是与所有数互质的数。
复杂度分析
给每一个数做因式分解 \(O(N\log N)\) 将每一个数排除 \(O(N)\) 故整体复杂度为 \(O(N\log N)\)
代码实现
import java.util.*;
public class coprime{
public static ArrayList<Integer> factorize(int num){
ArrayList <Integer> ans = new ArrayList<Integer>();
if(num%2==0){
while(num%2==0){
num/=2;
}
ans.add(2);
}
for (int i = 3; i*i <= num; i++) {
if(num%i==0){
while(num%i==0){
num/=i;
}
ans.add(i);
}
}
if(num!=1) ans.add(num);
//System.out.println(num+ " "+ans);
return ans;
}
public static void main (String [] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int [] nums = new int [n];
boolean [] factors = new boolean[100009];
Arrays.fill(factors, true);
for (int i = 0; i < nums.length; i++) {
nums[i] = in.nextInt();
}
ArrayList <Integer> allTheF = new ArrayList<Integer>();
for (int i = 0; i <nums.length; i++) {
allTheF = factorize(nums[i]);
for(int everyNum:allTheF){
if(factors[everyNum]){
for (int j = everyNum; j < factors.length; j+=everyNum) {
factors[j] = false;
}
}
}
}
int count = 0;
for (int i = 1; i <= m; i++) {
if(factors[i]) count++;
}
System.out.println(count);
for (int i = 1; i <= m; i++) {
if(factors[i]) System.out.println(i);
}
}
}