您的位置:首页 > 其它

[luoguP2618] 数字工程(DP)

2017-08-13 20:32 183 查看

传送门

 

离线处理。。。

先线性筛一遍。

直接预处理出所有答案。

注意要用push,用乘法,常数小。

 

#include <cstdio>
#include <cstring>
#define N 1000001
#define min(x, y) ((x) < (y) ? (x) : (y))

int n, cnt;
int f
, prime
;
bool notpri
;

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\n", f
);
return 0;
}

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: