反素数 Antiprime
【题目描述】
原题来自:POI 2001
如果一个大于等于 1的正整数 n,满足所有小于 n 且大于等于 1 的所有正整数的约数个数都小于 n 的约数个数,则 n 是一个反素数。譬如:1,2,4,6,12,24,它们都是反素数。请你计算不大于 n的最大反素数。
【输入】
一行一个正整数 n
【输出】
只包含一个整数,即不大于 n的最大反素数。
【输入样例】
1000
【输出样例】
840
#include<stdio.h>
typedef long long ll;
ll prime[]={0,2,3,5,7,11,13,17,19,23,29,31};
ll n,ges=0,ans=0;
void dfs(ll now,ll ges_s,ll sum,ll k)
{
if(ges_s>ges)
{
ges=ges_s;
ans=sum;
}
else if(ges_s==ges&&sum<ans)
ans=sum;
for(int i=1;i<=k;i++)
{
sum=sum*prime[now];
if(sum>n)
return ;
dfs(now+1,ges_s*(i+1),sum,i);
}
}
int main()
{
scanf("%lld",&n);
dfs(1,1,1,31);
printf("%lld\n",ans);
}