题目描述
在大木博士那里,小智发现推荐的三只宝可梦都已经被別人選走了,最终他挑选了皮卡丘作为自己的第一只宝可梦。皮卡丘不是很待见小智,但还是在危急之时救了小智一命,小智和皮卡丘的关系也因此熟络了许多。皮卡丘因为救小智受了重伤,小智急忙带着皮卡丘去常磐市的医院治疗。
常磐市经常发生绑架宝可梦的事件,犯人是一男一女,他们这天也来到了常磐市的治疗中心,准备劫走治疗中心里面罕见的宝可梦。用"华丽"的方式登场后,将他们的宝可梦瓦斯弹和阿柏蛇放出来,开始攻击和搜寻每一间房间,并且把电源给切断了。
小智、小霞和护士姐姐迅速把趟在病床上的皮卡丘推进传送室,停电后,护士姐姐说他们有备用电源,小智放眼一看,正在发电的居然是一群训练有素的皮卡丘!小智发现,每一个皮卡丘后背都有一个数字,护士姐姐解释说:“皮卡丘集中发电的能力跟他们后背的数字有关,当上场发电的皮卡丘们后背的数字任两个数字都互质的话,他们的发电能力就会强大无比!当然,同样都是互质的情况下,上场的皮卡丘数量越多越好。”
不管是战斗,还是发电,我们都需要皮卡丘!现在,已知共有 n 只皮卡丘,给出每只皮卡丘后背的数字,请你选择尽量多的皮卡丘上场,使得它们后背的数满足任意两个数字互质。只需输出你最多能选择了多少只皮卡丘。
注:两个数字互质当且仅当他们没有 1 以外的正公因数。
import java.util.Scanner;
public class Main {
public static int count = 0;
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
int i = read.nextInt();
for (int j = 0; j < i; j++) {
count = 0;
int n = read.nextInt();
boolean t[] = new boolean[n];
int num[] = new int[n];
for (int m = 0; m < n; m++) {
num[m] = read.nextInt();
}
f(num, num.length - 1, t);
System.out.println(count);
}
}
static void f(int num[], int length, boolean t[]) {// 每只皮卡丘只有两种选择,选与不选
if (length < 0) {
int i = 0;
for (int j = 0; j < num.length; j++) {
for (int k = 0; k < j; k++) {
if (t[k] && t[j])
if(prime(num[j], num[k]) != 1)
return ;
}
}
for (int k = 0; k < num.length; k++) {
if (t[k]) {
i++;
}
}
if (i > count) {
count = i;
}
return;
}
t[length] = false;
f(num, length - 1, t);
t[length] = true;
f(num, length - 1, t);
}
static long prime(long a, long b) {
if (a%b==0)
{
return b;
} else
{
return prime(b, a%b);
}
}
}