[POI2002][HAOI2007]反素数 题解
作者:互联网
主要思想是贪心+搜索
首先我们考虑一个数$n=a_i^{p_i}$
并且因数的个数为$\prod{(a_i+1)}$
然后就OK了
对于一个反素数$n=2^a 3^b 5^c ...$,必然有且仅有连续的质因子2,3,5,7...且有$a>=b$
否则就会有更小的数和它因数个数相同
所以我们可以直接搜索+剪枝
跑得飞快
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
inline int r()
{
int s=0,k=1;char c=getchar();
while(!isdigit(c))
{
if(c=='-')k=-1;
c=getchar();
}
while(isdigit(c))
{
s=s*10+c-'0';
c=getchar();
}
return s*k;
}
int n,maxi,a[50]={0,2,3,5,7,11,13,17,19,23,29};
int f[50],tmp;
void dfs(int now,int u,int x,int ans)//当前的数字,当前的指数,当前的底数
{
int tot=1;
if(maxi<ans)
{
maxi=ans;
tmp=now;
}
else if(maxi==ans)tmp=min(tmp,now);
for(int i=1;i<=u;i++)//最多到当前的指数
{
tot*=a[x];
if(tot*now>n)break;
f[x]=i;
dfs(now*tot,i,x+1,ans*(i+1));
f[x]=0;
}
}
signed main()
{
n=r();
dfs(1,1e9,1,1);
cout<<tmp<<endl;
}
标签:int,题解,dfs,POI2002,HAOI2007,while,tot,include,getchar 来源: https://www.cnblogs.com/lytql/p/15016906.html