Comet OJ - 2019六一欢乐赛B.宝可梦中心大对决!

题目描述

在大木博士那里,小智发现推荐的三只宝可梦都已经被別人選走了,最终他挑选了皮卡丘作为自己的第一只宝可梦。皮卡丘不是很待见小智,但还是在危急之时救了小智一命,小智和皮卡丘的关系也因此熟络了许多。皮卡丘因为救小智受了重伤,小智急忙带着皮卡丘去常磐市的医院治疗。

常磐市经常发生绑架宝可梦的事件,犯人是一男一女,他们这天也来到了常磐市的治疗中心,准备劫走治疗中心里面罕见的宝可梦。用"华丽"的方式登场后,将他们的宝可梦瓦斯弹和阿柏蛇放出来,开始攻击和搜寻每一间房间,并且把电源给切断了。

小智、小霞和护士姐姐迅速把趟在病床上的皮卡丘推进传送室,停电后,护士姐姐说他们有备用电源,小智放眼一看,正在发电的居然是一群训练有素的皮卡丘!小智发现,每一个皮卡丘后背都有一个数字,护士姐姐解释说:“皮卡丘集中发电的能力跟他们后背的数字有关,当上场发电的皮卡丘们后背的数字任两个数字都互质的话,他们的发电能力就会强大无比!当然,同样都是互质的情况下,上场的皮卡丘数量越多越好。”

不管是战斗,还是发电,我们都需要皮卡丘!现在,已知共有 nn 只皮卡丘,给出每只皮卡丘后背的数字,请你选择尽量多的皮卡丘上场,使得它们后背的数满足任意两个数字互质。只需输出你最多能选择了多少只皮卡丘。

注:两个数字互质当且仅当他们没有 11 以外的正公因数。

输入描述

输入有多组数据,第一行输入一个正整数 TT (T \le 10T≤10) ,表示测试组数。

然后对于每组数据,

第一行有一个正整数 nn (n \le 14n≤14),第二行有 nn 个两两相异的数 a_1,a_2,\ldots,a_na
1

,a
2

,…,a
n

(1 \le a_i \le 10^91≤a
i

≤10
9
),代表这 nn 只皮卡丘后背的数字。

输出描述

对于每组数据,输出一个正整数表示最多可以选几只皮卡丘,使得任两只皮卡丘后背的数字都互质。

样例输入 1

2
3
3 4 5
7
7 6 5 4 3 2 1
样例输出 1

3
5
提示

对于样例中第一组数据,可以三只皮卡丘同时上场,因为他们后背上的数字两两互质。

对于样例中第二组数据,我们可以选后背号码分别为 7,5,3,2,17,5,3,2,1 的 55 只皮卡丘。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<string>
#define ll long long
#define dd double
using namespace std;

ll t, n;
ll arr[20];
ll pick[20];
ll as;

ll gcd(ll a, ll b) {
	return b ? gcd(b, a % b) : a;
}

void dfs(ll x) {
	if (x == n) {
		for (ll i = 0; i < n; i++) {
			for (ll j = i + 1; j < n; j++) {
				if (pick[i] == 1 && pick[j] == 1 && gcd(arr[i], arr[j]) != 1) {
					return;
				}
			}
		}
		ll cnt = 0;
		for (ll i = 0; i < n; i++) {
			if (pick[i] == 1) {
				cnt++;
			}
		}
		as = max(cnt, as);
		return;
	}
	pick[x] = 1;
	dfs(x + 1);
	pick[x] = 0;
	dfs(x + 1);
}

int main() {
	while (cin >> t) {
		while (t--) {
			cin >> n;
			as = 0;
			memset(pick, 0, sizeof(pick));
			for (ll i = 0; i < n; i++) {
				cin >> arr[i];
			}
			dfs(0);
			cout << as << endl;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值