BZOJ1053: [HAOI2007]反素数ant

最多不会超过13个不同的素因数 

然后就每一个素因数去搜能乘几次 

2^2*3^3的因数是和2^3*3^2一样的  所以需要前一个素数的指数比后一个素数指数大

每次更新最优值


#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
int prime[101]={1,2,3,5,7,11,13,17,19,23,29,31,41,43};
ll num,has;
int n;
void DFS(int k,ll now,int cnt,int last)
{
	if(k==12){
		if(now>num&&cnt>has)has=cnt,num=now;
		if(now<=num&&cnt>=has)num=now,has=cnt;
		return ;
	}
	DFS(k+1,now,cnt,0);
	int tp=prime[k];
	if(tp*now>n)return;
	for(int i=1;i<=last;i++)
	 {
	 	DFS(k+1,now*tp,cnt*(i+1),i);
	 	tp*=prime[k];
		 if(now*tp>n)break;
	 }
}
int main()
{

	scanf("%d",&n);
	DFS(1,1,1,20);
    cout<<num;
	return 0;
} 


你可能感兴趣的:(bzoj)