luogup1463 反素数
解法
分析性质
考虑反质数的定义,显然反质数是n个数中约数最多且最小的(1)。
因为数据范围n<21e9,所以一个反质数中最多有10个不同的质因子(因为最小的10个相乘大于范围),
又因为2^31>21e9,所以指数和最多为30。
我们可以开始考虑搜索。
继续减枝:1.它的质因子最大为29,若有更大的质因子,那他本身一定不是最小(违反(1))。
2.指数一定递减,否则也违反(1)。
可以了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int prime[N]={0,2,3,5,7,11,13,17,19,23,29,31,37};
int n,maxn=1,Ans,Sum;
int read()
{
int x=0,p=1; char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') p=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*p;
}
void dfs(int p,int lastc,int sum,int ans)
{
if(ans>Ans || (ans==Ans && sum<Sum)) Ans=ans,Sum=sum;
if(p>maxn) return ;
for(int i=0;i<=lastc;i++)
{
if(n<prime[p]*sum) break ;
if(i) sum*=prime[p];
if(sum<=n)
dfs(p+1,i,sum,ans*(i+1));
}
}
main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read();
for(int i=1;;i++)
if(maxn*prime[i]<n) maxn*=prime[i];
else { maxn=i; break ; }
dfs(1,30,1,1);
cout<<Sum<<endl;
return 0;
}
要开long long