题解 P2618 【数字工程】

· · 题解

既然可以DP,为什么不能记忆化搜索呢?

只需要每一次 O(\sqrt{n}) 枚举因子,事先预处理好质数就可以开搜了。时间复杂度 O(n\sqrt{n}),但是洛谷评测机很快,可以过。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int vst[1000005],prime[1000005],s[1000005],n,ans[1000005];
int DFS(int x){
    if(~ans[x])return ans[x];
    ans[x]=0x3f3f3f3f;
    for(int i=1;i*i<=x;i++){
        if(!(x%i)){
            if(!vst[i])ans[x]=min(ans[x],DFS(x/i)+1);
            if(!vst[x/i])ans[x]=min(ans[x],DFS(i)+1);
        }
    }
    ans[x]=min(ans[x],DFS(x-1)+1);
    return ans[x];
}
int main(){
    vst[1]=1;
    for(int i=2;i<=1000000;i++){
        if(vst[i])continue;
        prime[++prime[0]]=i;
        for(long long j=1ll*i*i;j<=1000000;j+=i)vst[j]=1;
    }
    memset(ans,-1,sizeof(ans));
    ans[1]=0;
    while(~scanf("%d",&n)){
        printf("%d\n",DFS(n));
    }
    return 0;
}