OpenJudge_P7834 分成互质组
2015-11-29 11:40
330 查看
总时间限制: 1000ms 内存限制: 65536kB
描述
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入
第一行是一个正整数n。1 <= n <= 10。
第二行是n个不大于10000的正整数。
输出
一个正整数,即最少需要的组数。
样例输入
6
14 20 33 117 143 175
样例输出
3
来源
2008年第十三届“华罗庚金杯”少年数学邀请赛 决赛第5题
辗转相除法
描述
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
输入
第一行是一个正整数n。1 <= n <= 10。
第二行是n个不大于10000的正整数。
输出
一个正整数,即最少需要的组数。
样例输入
6
14 20 33 117 143 175
样例输出
3
来源
2008年第十三届“华罗庚金杯”少年数学邀请赛 决赛第5题
辗转相除法
#include<cstdio> #include<iostream> using namespace std; #define N 15 int a ,n,s ,ans;bool b ; int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);} bool prime(int x,int p){ for(int i=1;i<=s[p][0];i++){ if(a[x]>=s[p][i]) if(gcd(a[x],s[p][i])!=1) return false; if(a[x]<s[p][i]) if(gcd(s[p][i],a[x])!=1) return false; } return true; } void work(int i,int k){ if(i==n+1){ans=min(ans,k);return;} for(int j=1;j<=k;j++){ if(prime(i,j)){ s[j][++s[j][0]]=a[i]; work(i+1,k); s[j][s[j][0]--]=0; } } s[k+1][0]=1;s[k+1][1]=a[i]; work(i+1,k+1); s[k+1][0]=0;s[k+1][1]=0; } int main(){ scanf("%d",&n);ans=10; for(int i=1;i<=n;i++) scanf("%d",&a[i]); s[1][0]=1,s[1][1]=a[1]; work(2,1); printf("%d",ans); }
相关文章推荐
- openjudge 2739 测试了多组数据结果都是正确的,但是oj提交结果为WA,有人感兴趣的话看看
- openjudge1.11编程基础之二分查找 04:网线主管
- OpenJudge - 1002:方便记忆的电话号码
- OpenJudge - 1088:滑雪
- OpenJugde - 2774:木材加工
- OpenJudge - 1207:The 3n + 1 problem
- 放苹果(poj1664),递推与递归
- 用栈将中缀表达式转化为后缀表达式
- 单调队列与滑动窗口(Sliding window, poj2823)
- 广度优先搜索bfs与抓住那头奶牛(Catch that cow, poj3278)
- KMP算法、next数组与前缀中的周期(相关题目:Power strings, poj2406)
- 由中根序列和后根序列重建二叉树
- 由后缀表达式建立表达式树
- poj2499 Binary Tree
- openjudge物质分解记录
- openjudge树的转换
- poj3630 Phone List与Trie
- poj1760 Disk Tree
- openjudge 我爱北大
- openjudge 拓扑排序