【BZOJ】1053: [HAOI2007]反素數ant-搜尋
阿新 • • 發佈:2018-12-21
題解
打表是不可能的(這輩子都不可能的)。
搜尋是必須的。考慮如何高效地剪枝。
設,則。
當存在且時,必然不是反素數,因為後能得到一個更小的滿足。
所以反素數必然是由最小的前幾個質數構成的,且次冪單調不增。
程式碼
#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; }