【题目描述】
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?

【输入】
第一行是一个正整数n。1 ≤ n ≤ 10。

第二行是n个不大于10000的正整数。

【输出】
一个正整数,即最少需要的组数。

【输入样例】
6
14 20 33 117 143 175
【输出样例】
3

分析

  1. 互质数:两个数的最大公约数为1,那么这两个数互质,所以我们要有一个求两个数最大公约数的函数gcd;
  2. 关于几个互质的数怎么放一组,怎么判断一个数是否可以放在该组,我采用了一个group数组,去存放某一组的所有数的乘积,如果需要判断的数和这个组的乘积都互质,那么与该组所有的数都互质。
  3. 关于求分组的问题,我们采用逐个去判断,在处理第step个数的时候,我们逐个与前面的gro组进行判断,看看有没有可以放在其中的组,如果没有的话我们新创一个组,去搜索下一个数,再让其判断前面的gro个组,看看有没有合适的…
  4. 关于范围,由于每个数最大10000,如果一组有五六个这样的数,那么int就会爆,所以在求gcd以及group数组要定义为long long类型
  5. 细节性问题:要注意初始化group数组,而且在判断第step个数可以放在哪一组的时候,我们要让i从1开始( i 就是遍历gro个组的),因为我们搜索的时候默认有第一组,而不能习惯性从第0组搜索(那就把第gro组漏了没去判断),然后就会造成结果不对;
#include <bits/stdc++.h>using namespace std;
const int N = 25;
typedef long long ll;int arr[N];
ll group[N];//记录每组的乘积
int n, ans = 15;//最大公约数
ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);
}//gro:当前一共分了gro组;step:当前正在处理第几个数
void dfs(int gro, int step) {//最后一个数也已经分好组了if (step == n) {ans = min(ans, gro);return;}//看看step这个索引的数,能不能放在gro个组中,不能的话,创建一个新组//i从1到<=gro;而不是从0到<grofor (int i = 1; i <= gro; ++i) {//第step这个数,能分在当前第i组if (gcd(arr[step], group[i]) == 1) {//表示当前第step个数与第gro组的数都互质group[i] *= arr[step];//去搜下一个数dfs(gro, step + 1);group[i] /= arr[step];}}//前gro组都放不下它,需要新创建一组group[gro + 1] *= arr[step];dfs(gro + 1, step + 1);group[gro + 1] /= arr[step];
}int main() {cin >> n;for (int i = 0; i < n; ++i) {cin >> arr[i];group[i] = 1;}//这样是错误的,不能初始为1//memset(group, 1, sizeof(group));//排不排序都可以sort(arr, arr + n);dfs(1, 0);cout << ans;return 0;
}

1221:分成互质组相关推荐

  1. 信息学奥赛一本通(1221:分成互质组)

    1221:分成互质组 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 7405     通过数: 3453 [题目描述] 给定n个正整数,将它们分组,使得每组中任意 ...

  2. 小学奥数 7834 分成互质组 python

    http://noi.openjudge.cn/math/7834/ 参考: 信息学奥赛一本通(1221:分成互质组) https://blog.csdn.net/lvcheng0309/articl ...

  3. C++递归算法之分成互质组

    分成互质组 Description 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? Input 第一行是一个正整数n.1 <= n <= 10. 第二行是n个不 ...

  4. POJ 7834:分成互质组

    " Ctrl AC!一起 AC!" 原题:忘题戳这 分析:对于一个数,遍历所有的互质组,如果可以进入一个组,并保持组内互质,则总组数不变.否则总组数加一. AC代码: #inclu ...

  5. 分成互质组 (信息学奥赛一本通-T1221)

    [题目描述] 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? [输入] 第一行是一个正整数n.1 ≤ n ≤ 10. 第二行是n个不大于10000的正整数. [输出] 一个 ...

  6. AcWing 1118. 分成互质组

    题意: 给定 n 个正整数,将它们分组,使得每组中任意两个数互质. 问:至少要分成多少个组? 思路: dfs,对每一个元素,我们有两种操作: ①:放到现有组中的最后一组中(依次枚举最后一组的所有元素, ...

  7. 1118. 分成互质组

    给定 n 个正整数,将它们分组,使得每组中任意两个数互质. 至少要分成多少个组? 输入格式 第一行是一个正整数 n. 第二行是 n 个不大于10000的正整数. 输出格式 一个正整数,即最少需要的组数 ...

  8. 【noi 2.5_7834】分成互质组(dfs)

    有2种dfs的方法: 1.存下每个组的各个数和其质因数,每次对于新的一个数,与各组比对是否互质,再添加或不添加入该组. 2.不存质因数了,直接用gcd,更加快.P.S.然而我不知道为什么RE,若有好心 ...

  9. OpenJudge 7384(分成互质组)

    应hfu要求,近几日整理搜索专题的内容,无意中翻出了一年前死活A不掉的一道不可做题(当时觉得).看着自己的代码风格变化天翻地覆,无奈感叹时间飞逝...算了少矫情管他的先A了再说(ง •̀_•́)ง 先 ...

最新文章

  1. java 找不到符号变量_java编程找不到符号
  2. innerHTML outerHTML innerText
  3. docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么
  4. 获取日期对应的财务期间
  5. Ajax 模糊查询的简单实现
  6. F. It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!
  7. 作者:李俊清,山东农业大学副教授。
  8. 项目配置不当引发了数据泄露,人已裂开!!
  9. 来自数据库的MVC 6动态导航菜单
  10. boot定时任务开启和关闭 spring_Spring-Boot 下定时任务通过配置文件控制开关和执行时间...
  11. java jnlp_Java Web Start 与jnlp结合实例讲解
  12. c语言出100道计算题,C语言例题100道
  13. simulink 状态空间加反馈报错
  14. (学习笔记)图像处理——Retinex增强
  15. NWR,Gossip,Paxos分布式一致性协议
  16. 计算机断层CT检查肺部混浊,揪出早期肺癌 低剂量电脑断层检查
  17. turf.js字典——查询turf库的所有方法及用途
  18. 什么是REST ful?
  19. 【Tools】抓包工具——Charles(中名:花瓶)
  20. python开发工程师是干嘛的-python开发工程师是做什么的

热门文章

  1. [ VRTK ] --- 学习日记01
  2. 谷歌浏览器无法翻译一分钟解决
  3. js将json自动转html表格实例
  4. android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...
  5. 按钮(UIButton)的用法
  6. android在浏览器中打开,在android浏览器中打开一个链接(WebView)
  7. android浏览器修改文字,TextOnly:简洁“文字版”Android浏览器
  8. css实现右下角√对号选中样式——基础积累
  9. TCP三次握手四次分手不一样的解释
  10. golang实现httphttps代理服务器