[POI2002][HAOI2007]反素數 題解
阿新 • • 發佈:2021-07-15
主要思想是貪心+搜尋
首先我們考慮一個數$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; }