1. 程式人生 > >【BZOJ】1053: [HAOI2007]反素數ant-搜尋

【BZOJ】1053: [HAOI2007]反素數ant-搜尋

題解

打表是不可能的(這輩子都不可能的)。

搜尋是必須的。考慮如何高效地剪枝。

x=i=1npiki(piP)x=\prod \limits_{i=1}^n p_i^{k_i}(p_i\in P),則g(x)=i=1n(ki+1)g(x)=\prod \limits_{i=1}^n(k_i+1)

當存在pi<pjp_i<p_jki<kjk_i<k_j時,xx必然不是反素數,因為swap(ki,kj)swap(k_i,k_j)

後能得到一個更小的g(x)g(x')滿足g(x)=g(x)g(x')=g(x)

所以反素數必然是由最小的前幾個質數構成的,且次冪單調不增。

程式碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int n,ans=0;ll cur;
int p[20]={2,3,5,7,11,13,17,19,23,29,31,37,41};

void dfs(ll v,int pos,ll val,int lim)
{
	if(pos==10){
		if(val>=cur){
			if(val>cur) cur=val,ans=v;
			else if(v<ans) ans=v;
		}
		return;
	}
	for(int i=0;i<=lim;++i){
	    dfs(v,pos+1,val*(i+1),i);
	    v*=p[pos];if(v>n) break;
	}
}

int main(){
	scanf("%d",&n);
	dfs(1,0,1,31);
	printf("%d",ans);
	return 0;
}