In this problem, you are given an integer number s. You can transform any integer number A to another integer number B by adding x to A. This x is an integer number which is a prime factor of A (please note that 1 and A are not being considered as a factor of A). Now, your task is to find the minimum number of transformations required to transform sto another integer number t.
Input
Input starts with an integer T (≤ 500), denoting the number of test cases.
Each case contains two integers: s (1 ≤ s ≤ 100) and t (1 ≤ t ≤ 1000).
Output
For each case, print the case number and the minimum number of transformations needed. If it's impossible, then print -1.
Sample Input
2
6 12
6 13
Sample Output
Case 1: 2
Case 2: -1
题目大意:给两个数s,t,然后s加上他的一个质因子形成另一个数,在让这个新的数加上他的质因子形成另一个数,输出最少的这个过程是s==t,得不到就输出-1
解题思路:bfs求解
AC代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool vis[1100];
int prime[1100];
int s,t;
struct node{
int x;
int step;
};
void get_prime()//素数打表
{
for(int i=2;i*i<=1100;i++)
{
if(!prime[i])
{
for(int j=i*i;j<=1100;j+=i)
prime[j]=1;
}
}
}
int bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
node now,nextt;
now.x=s;
now.step=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==t)
return now.step;
for(int i=2;i<now.x;i++)
{
if(now.x%i==0&&!prime[i]&&now.x+i<=t&&!vis[now.x+i])
{
nextt.x=now.x+i;
nextt.step=now.step+1;
vis[nextt.x]=1;
q.push(nextt);
}
}
}
return -1;
}
int main()
{
int T,k=1;
get_prime();
cin>>T;
while(T--)
{
cin>>s>>t;
printf("Case %d: %d\n",k++,bfs());
}
return 0;
}