Gym
来源:互联网 发布:胸痛中心数据填报平台 编辑:程序博客网 时间:2024/06/05 22:07
题意:
输入一个数N,在1~N中,对于任意两个数A,B,如果A能被B整除,那么A,B,要染上不同的颜色,颜色用不同的数字表示,然而要保证用到的颜色的数量最小,问你怎么排列。
分析:
首先想到的是类似于素数筛那样的填数,但是发现思路不对,而且有的数会染重复,那么正确的思路是对1~N的每个数进行素数分解。那么所有的素数都标2,1被1占了,接下来分解后的一个数就可以表示出来它最大的那个因子(除了本身),那么这个数的染色应该是最大的那个因子染色的数字+1,从小到大处理的话就可以遍历到每一种情况了,复杂度n*sqrt(n).
#include <bits/stdc++.h>using namespace std;#define ll long longint Stack[1000], top, Cnt[1000],tmp[1000];//stack是素因子数组,cnt是素因子的幂 //tmp[i]保存n!/(n-m)!中素因子stack[i]的个数void fenjie(int k)//分解的是k{top = 0;memset(Cnt, 0, sizeof Cnt);for(int i = 2; i*i<=k; i++)if(k%i==0){while(k%i==0)Cnt[top]++, k/=i;Stack[top++] = i;}if(k>1){Cnt[top]++;Stack[top++] = k;}}const int N=10050;int a[N];void init(){ a[1]=1; for(int i=2;i<N;i++) { fenjie(i); int temp=i/Stack[0];///找到除本身外最大的那个因子 if(temp==1)///质数 a[i]=2; else a[i]=a[temp]+1;///当前染色数应是最大除本身因子染色数+1 }}int main(){ init(); ios::sync_with_stdio(false); int n; while(cin>>n) { int maxn=0; for(int i=1;i<=n;i++) maxn=max(maxn,a[i]); cout<<maxn<<endl; for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } return 0;}
阅读全文
0 0
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- 【Linux文件目录命令】head命令
- 推荐系统中协同过滤算法实现分析
- 面向对象的三大特征
- [C语言]给一个二维字符数组赋值的问题
- spark大数据架构初学入门基础详解
- Gym
- 树与二叉树
- 浏览器原理(一)——浏览器的介绍
- OpenCV环境搭建(Linux)
- 顺序栈的基本操作
- 【Linux文件目录命令】tail命令
- 洛谷P1850 换教室(NOIp2016 Day1 T3)(BZOJ 4720)
- Java编程思想读书笔记——通过异常处理错误(一)
- 记录RedHat上一些命令