参考了Acmdreamers的博客
反素数的定义:
对于任何正整数n,其约数个数记为f(n)。
如果某个正整数n满足:对任意的正整数i
(0<i<n)
,都有
f(i)<f(n)
,那么称n为反素数。
为了保证有n个约数的这个数尽量小,所有质因子必然是从2开始的连续若干个质数,并且因子的个数递减。
应用
1. 给定一个数n,求一个最小的正整数x,使得的x约数个数为n
2. 求出1~n中约数个数最多的这个数
主要使用dfs来计算x
下面是一道例题CodeForces27E
#include<iostream>
using namespace std;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
unsigned long long n,ans;
void dfs(int dep,unsigned long long temp,int num)
{
//cout<<dep<<' '<<temp<<' '<<num<<endl;
if(num > n) return;
if(num == n)
{
if(temp < ans)
ans = temp;
return;
}
for(int i = 1;i<=63;i++)
{
if(temp*p[dep]>ans)
break;
temp*= p[dep];
//cout<<temp<<endl;
dfs(dep+1,temp,num*(i+1));
}
}
int main()
{
cin>>n;
ans = 0x3f3f3f3f3f3f3f3f;
dfs(0,1,1);
cout<<ans<<endl;
}