AcWing 198. 反素数
原题链接
中等
作者:
Anoxia_3
,
2020-07-29 11:28:06
,
所有人可见
,
阅读 461
/*
求的是1~n中,约数最多的最小值,利用约数和定理。
①在int范围内,一个数最多有9个不同的质因子
②在int范围内,一个数最多有30次。(2^30 < int)
③因为求的是最小,所以因子的次数递减,由约数和定理可知,影响约数个数的因素是每个数的个数,如果存在一对逆序的次数,
将这对次数交换,约数个数不变,但是得到的值会变小。
*/
#include <iostream>
using namespace std;
typedef long long LL;
int primes[9] = {2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23};
int maxd , number;//约数个数的最大值,当前的数
int n;
void dfs(int u , int last , int p , int s)//枚举到第u个质数,上一个质数的次数是last,当前数的和是p,约数个数是s
{
if(s > maxd || s == maxd && p < number)
{
maxd = s;
number = p;
}
if(u == 9) return;
for(int i = 1 ; i <= last ; i ++)
if((LL) p * primes[u] < n)
{
p *= primes[u];
dfs(u + 1 , i , p , s * (i + 1));
}
}
int main()
{
cin >> n;
dfs(0 , 30 , 1, 1);
cout << number << endl;
return 0;
}
在这里终于看懂了,质因子次数递减是啥意思了
加油hh