[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;
}
posted @ 2021-07-15 18:15  lei_yu  阅读(28)  评论(0编辑  收藏  举报