この質問の詳細については、https ://www.interviewstreet.com/challenges/dashboard/#problem/4f7272a8b9d15 を参照してください。
1 つの友好的な番号と N の非友好的な番号があります。友好的な数を正確に分割し、非友好的な数を分割しない数がいくつあるかを見つけたいと考えています。
入力形式: 入力の最初の行には、スペースで区切られた 2 つの数値 N と K が含まれます。N は友好的でない番号の数、K は友好的な番号です。入力の 2 行目には、スペースで区切られた N 個の不適切な数字が含まれています。
出力形式: 回答を 1 行で出力します。
制約:
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 つだけ存在します。したがって、答えは 1 です。
多くの人がこの質問をしましたが、完璧な答えはありませんでした。他の人が閉じているため、これは重複していません。この質問をする必要があります
エラトステネスのふるいを使用して、不親切な数字を洗練しました(重複を削除し、指定された例の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 つのテスト ケースを解決しました。誰か助けてください。
前もって感謝します