离线处理。。。
先线性筛一遍。
直接预处理出所有答案。
注意要用push,用乘法,常数小。
#include <cstdio> #include <cstring> #define N 1000001 #define min(x, y) ((x) < (y) ? (x) : (y)) int n, cnt; int f[N], prime[N]; bool notpri[N]; inline void init() { int i, j; notpri[0] = notpri[1] = 1; for(i = 2; i < N; i++) { if(!notpri[i]) prime[++cnt] = i; for(j = 1; i * prime[j] < N; j++) { notpri[i * prime[j]] = 1; if(!(i % prime[j])) break; } } } int main() { int i, j; init(); memset(f, 127, sizeof(f)); f[1] = 0; for(i = 1; i < N - 1; i++) { f[i + 1] = min(f[i + 1], f[i] + 1); for(j = 1; j <= cnt && i * prime[j] < N; j++) f[i * prime[j]] = min(f[i * prime[j]], f[i] + 1); } while(~scanf("%d", &n)) printf("%d ", f[n]); return 0; }