题目描述
如果一个大于等于 1 的正整数 n,满足所有小于 n 且大于等于 1 的所有正整数的约数个数都小于 n 的约数个数,则 n 是一个反素数。譬如:1, 2, 4, 6, 12, 24,它们都是反素数。
请你计算不大于 n 的最大反素数。
输入格式
一行一个正整数 n。
输出格式
只包含一个整数,即不大于 n 的最大反素数。
样例
Input
1000
Output
840
数据范围与提示
对于 10% 的数据,1≤n≤10^3;
对于 40% 的数据,1≤n≤10^6;
对于 100% 的数据,1≤n≤2×10^9。
解题思路
约数个数求法:设m=2^t1 * 3^t2 * ... * p^tk(p为第k大的质数,则m的约数个数=(t1+1)*(t2+1)*(t3+1)*...*(tk+1)).
代码如下
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,mx,ans,p[11]={0,2,3,5,7,11,13,17,19,23,29};
void dfs(ll id,ll sum,ll smx,ll num)
{
if(id>10) return ;
if(sum>mx||(sum==mx&&num<ans))
mx=sum,ans=num;
for(int i=1;i<=smx;i++)
{
num*=p[id];
if(num>n) return ;
dfs(id+1,(i+1)*sum,i,num);
}
}
int main()
{
scanf("%lld",&n);
dfs(1,1,31,1);
printf("%lld",ans);
}