题目描述
在大木博士那里,小智发现推荐的三只宝可梦都已经被別人選走了,最终他挑选了皮卡丘作为自己的第一只宝可梦。皮卡丘不是很待见小智,但还是在危急之时救了小智一命,小智和皮卡丘的关系也因此熟络了许多。皮卡丘因为救小智受了重伤,小智急忙带着皮卡丘去常磐市的医院治疗。
常磐市经常发生绑架宝可梦的事件,犯人是一男一女,他们这天也来到了常磐市的治疗中心,准备劫走治疗中心里面罕见的宝可梦。用"华丽"的方式登场后,将他们的宝可梦瓦斯弹和阿柏蛇放出来,开始攻击和搜寻每一间房间,并且把电源给切断了。
小智、小霞和护士姐姐迅速把趟在病床上的皮卡丘推进传送室,停电后,护士姐姐说他们有备用电源,小智放眼一看,正在发电的居然是一群训练有素的皮卡丘!小智发现,每一个皮卡丘后背都有一个数字,护士姐姐解释说:“皮卡丘集中发电的能力跟他们后背的数字有关,当上场发电的皮卡丘们后背的数字任两个数字都互质的话,他们的发电能力就会强大无比!当然,同样都是互质的情况下,上场的皮卡丘数量越多越好。”
不管是战斗,还是发电,我们都需要皮卡丘!现在,已知共有 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); } } }