反素数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反素数相关的知识,希望对你有一定的参考价值。
素数的约数只有1和本身, 而反素数是约数尽可能多, 多到,比它小的数, 约数就不会比它多。、性质
反素数的通式:
p=2^t1 * 3^t2 * 5^t3 * 7^t4 .....( t1>=t2 >= t3 >= ....)
尽可能多就表现在
- 质因子是从最小的2开始的连续的质数
- 小的质因子比大的质因子的数目更多
通式如上的约数个数为 ( t1 + 1) ( t2 +1 ) ( t3 + 1 ) *........
由此可见 t1, t2....的数目越多越好。
问题提出
把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。如果有多个数复杂度相等,输出最小的。
基本思路
由于所求的数拥有的小质因数尽可能多, 我们需要遍历尽可能多的小质因数的情况, 在深度搜索大质因数的尽可能多的情况, 没有必要不断判断 t1, t2, t3之间的关系。用 maxsum 记录最大的约数个数即可。
辅助数组:const int prime[16]= {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
伪码:
typedef long long ll;
getantiprime( 1, 1, 1, );
getantiprime( ll num, ll k, ll sum ){
if( sum > maxsum )
maxsum = sum ;
for( int i=1 ; ; i++ ){
num *= prime[ k ];
getantiprime( num, k+1, sum*(i+1) );
}
}
以上是关于反素数的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 1053 1053: [HAOI2007]反素数ant (反素数)