1. 程式人生 > 其它 >[POI2002][HAOI2007]反素數 題解

[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;
}