题意:
对于一个大于等于4的数K,可以加上它的一个因子(1,K除外)得到另一个数。
给N和M(N小于等于M),求从N到M的最小操作次数。
思路:
因为
M<=100000
,枚举因子是
sqrt(K)
所以怎么搞都好啦~~
class DivisorInc
{
public:
int countOperations(int N, int M)
{
memset(f, 0xff, sizeof(f));
f[N] = 0;
for (int i=N+2;i<=M;++i) {
int last = sqrt(i), tmp = inf;
for (int j=last;j>=2;--j) if (i%j == 0) {
if (i/j >= 3) {
int from = i - j;
if (f[from] != -1) {
tmp = min (tmp, f[from]+1);
}
}
if (j >= 3) {
int from = i - i/j;
if (f[from] != -1) {
tmp = min (tmp, f[from]+1);
}
}
}
if (tmp < inf) f[i] = tmp;
}
return f[M];
}
};