【2016.5.21普及组模拟】约数国王(A king)
(File IO): input:king.in output:king.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Description
数学的王国里,有一些约数国王……约数国王的定义是这样的:一个大于1的整数n,如果它约数的个数比1~n-1的每个整数的约数的个数都要多,那么我们就称它为约数国王。聪明的小明在奥数书上认识了它们,于是产生了一个问题:他想知道L到R之间一共有多少个约数国王?它们分别又是谁?
Input
输入文件只有一行,包含一个l,一个r,表示小明想知道的范围。
Output
只有一行,第一个数h,表示l~r内一共有多少个约数国王,接下来h个从小到大的数(为了防止国王们打架,你需要按顺序输出。),表示约数国王分别是谁。
Sample Input
1 100
Sample Output
8 2 4 6 12 24 36 48 60
Data Constraint
- 对于30%的数据,1<=l<=r<=200000。
- 对于50%的数据,1<=l<=r<=500000。
- 对于70%的数据,保证最大的约数国王的约数的个数不大于1000。
- 对于100%的数据,1<=l<=r, 并且保证l,r在64位整型以内,最大的约数国王的约数的个数不大于200000。
解题思路
首先,我们设一个c[i],表示因数个数(包括本数)为i,的最小正整数,那么对于一个数c[i],如果c[i]<任何一个c[i+k] (k为正整数),那么c[i]就是一个约数国王。
对于求出c[i],我们可以设P[i]为从小到大的质数中的第i个。这里用线性筛法可以求出来。
我们可以在设一个F[i,j]表示,有i个不同质因数构成,有j个因数的最小正整数。
那么,c[i]=Max{F[k,i]}。
求一个数的因子个数的公式:
若 N=P1A1+P2A2+P3A3+...+PmAm 也就是 N=∑m</