[OpenJudge 7834]分成互质组 迭代加深+剪枝
2015-10-30 19:05
218 查看
题目大意
给定n个数,求至少能分成多少互质组代码
#include <cstdio> #include <iostream> #include <cstring> #include <ctime> using namespace std; int n,a[100],b[100]={0},maxd(0),f(0),gcd[20005][20005]; int Stein(int u,int v) { if (u == 0) return v; if (v == 0) return u; // look for factors of 2 if (~u & 1) // u is even { if (v & 1) // v is odd return Stein(u >> 1, v); else // both u and v are even return Stein(u >> 1, v >> 1) << 1; } if (~v & 1) // u is odd, v is even return Stein(u, v >> 1); // reduce larger argument if (u > v) return Stein((u - v) >> 1, v); return Stein((v - u) >> 1, u); } int Gcd(int x,int y){ if(y==0) return x; else return Gcd(y,x%y); } int Dfs(int x){ if(f) return 1; if(x>n){ f=1; return 1; }else{ for(int i=1;i<=maxd;i++){ b[x]=i; int flag=0; for(int j=1;j<x;j++){ if(b[j]==i){ if((gcd[j][x]==1)||(gcd[x][j]==1)){ continue; }else{ flag=1; break; } } } if(flag==1){ continue; } Dfs(x+1); } return 0; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(Stein(a[i],a[j])==1){ gcd[i][j]=1; }else{ gcd[i][j]=-1; } } } for(maxd=1;maxd<=n;maxd++){ memset(b,0,sizeof(0)); Dfs(1); if(f==1){ printf("%d",maxd); break; } } return 0; }
相关文章推荐
- Linux C 指针
- ### OpenCV安装(Linux)
- 磁盘性能指标--IOPS、吞吐量及测试
- Linux进程组调度机制分析
- Apache CXF实现WebService入门教程(附完整源码)
- ### Shell Script
- linux sed 命令用法
- Linux关机命令详解
- 学习前端比较好的网站
- XMPP 服务器 Openfire 的 Emoji 支持问题(进行部分修改)
- /etc/init.d/nginx
- Linux系统内存监控全面讲解:free命令
- gurobi安装
- openfire开发(五)openfire插件打包另类打法
- bash函数定义/使用/传参…
- bash字符串操作
- linux程序包管理之yum
- linux DTS 分析
- bash数组操作-定义/初始化/赋值…
- nginx直接访问html的配置