一、题目描述
第一行输入 n,表示样例个数。
接下来n行每行两个数 s 和 t,单个空格分隔,表示两个质数。
对每一个样例,输出从 s 变换到 t 需要的最小花费。
s 和 t 保证为 1000 到 9999 之间的质数。每次变换只能变换一位,花费 1 英镑。
提示:已经换下来的数字不能再放上去。例如从 1033 变换至 8179:
1033
1733
3733
3739
3779
8779
8179
第二次变换中换下的 1(变成了 3)不能在最后一步中直接放上去,必须要一个额外的 1,这个花费不能省。
如果不能变换,输出:
Impossible
样例:
输入
3
1033 8179
1373 8017
1033 1033
输出
6
7
0
二、算法分析说明与代码编写指导
先套个质数打表的板子,获得 10000 以内的全部质数:
//版本一:
unsigned prime[6542] = {
2,3 }, _PTy, MaxPrime;
inline void genprime(const size_t& _Size) {
decltype(_PTy) a = 4, t; bool flag;
for (size_t i = 2; i < _Size;) {
t = sqrt(a), flag = true;
for (size_t j = 0; prime[j] <= t; ++j)
if (a % prime[j] == 0) {
flag = false; break; }
if (flag) {
prime[i] = a, ++i; }
++a;
}
MaxPrime = prime[_Size - 1];
}
inline bool isprime(const decltype(_PTy)& x) {
if (x <= MaxPrime)return binary_search(prime, prime_end, x);
else {
decltype(_PTy) t = min((decltype(_PTy))sqrt(x), MaxPrime);
for (size_t j = 0; prime