有关此问题的更多信息,请查看此处:https ://www.interviewstreet.com/challenges/dashboard/#problem/4f7272a8b9d15
有1个友好号码和N个不友好号码。我们想找出有多少数字正好整除友好数字,但不整除任何不友好数字。
输入格式:输入的第一行包含两个数字 N 和 K,用空格分隔。N是不友好号码的数量,K是友好号码。输入的第二行包含 N 个空格分隔的不友好数字。
输出格式:在一行中输出答案。
约束:
1 <= N <= 10^6
1 <= K <= 10^13
1 <= unfriendly numbers <= 10^18
样本输入:
8 16
2 5 7 4 3 8 3 18
样本输出:
1
解释:给定友好数字 16 的除数是 { 1, 2, 4, 8, 16 },不友好数字是 {2, 5, 7, 4, 3, 8, 3, 18}。现在1整除所有不友好的数字,2整除2,4整除4,8整除8,但16不整除任何一个。所以只有一个数字可以除掉友好的数字,但不除掉任何不友好的数字。所以答案是1。
很多人问过这个问题,但没有给出完美的答案。这不是重复的,因为其他人都关闭了,我要问这个问题
我使用 Eratosthenes 的筛子来优化不友好的数字(删除重复项,删除给定示例中不必要的数字,如 2 和 4。除以 2 和 4 的数字也除以 8,所以只有 8 wud 达到目的。完成所有这些后,我去除素数)
这是我的代码
import java.io.*;
import java.util.*;
public class unfriendly {
public static ArrayList<Long> refine_unfriendly(ArrayList<Long> uf){
int n=uf.size();
long x;
for(int i=uf.size()-1;i>=0;i--){
x=uf.get(i);
for(int j=uf.size()-1;j>=0;j--){
if(j==i)
continue;
if(j!=i && uf.get(j)%x==0){
x=uf.get(j);
uf.remove(i);
break;
}
else if(j!=i && x%uf.get(j)==0){
uf.remove(j);
break;
}
}
}
return uf;
}
public static void print_output(long k,ArrayList<Long> uf){
int n=uf.size(),count=0,i;
long x,y;
if(n==0)
count++;
for(x=2;x<=Math.sqrt(k);x++){
if(k%x==0){
for(i=0;i<n;i++){
if(uf.get(i)%x==0)
break;
}
if(i==n)
count++;
if(k/x!=x){
y=k/x;
for(i=0;i<n;i++){
if(uf.get(i)%y==0)
break;
}
if(i==n)
count++;
}
}
}
for(i=0;i<n;i++){
if(uf.get(i)%k==0)
break;
}
if(i==n)
count++;
System.out.println(count);
}
public static void main(String[] args) throws Exception {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
long k=in.nextLong();
ArrayList<Long> uf=new ArrayList<Long>();
for(int i=0;i<n;i++)
uf.add(in.nextLong());
uf=refine_unfriendly(uf);
print_output(k,uf);
}
}
这仅解决了 6 个测试用例中的 1 个。其余的超出了时间限制。蛮力法(未精炼)解决了 3 个测试用例。有人请帮忙。
提前致谢