题意 : A 可以通过 + A 非本身的质因子,成为 B ,给出 s 和 t,判断 s 是否可以转换成 t
思路 : 预先统计出1~1e3每个数的质因子,如果 s == t,自然是一,如果s 和 t 其中一个是 质数者必定为 -1,其他 BFS
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#define N 1000
using namespace std;
const int INF = 0x3f3f3f3f / 2;
int vis[N+10],s,t,flag,cut;
int pri[N+10];
vector<int >pf[N];
struct node{
int x,pl;
};
void getPri(){
pri[0]=pri[1]=1;
for(int i=2;i<N;i++){
if(!pri[i]){
for(int j=i+i;j<N;j+=i)
pri[j]=1;
}
}
for(int i=2;i < N; i ++){
for(int j = 2;j < i; j++){
if(i%j == 0 && !pri[j]){
pf[i].push_back(j);
}
}
}
}
void bfs(){
memset(vis,0,sizeof(vis));
vis[s]=1;
queue<node> q;
node o;
o.x=s;o.pl=0;
q.push(o);
while(!q.empty()){
o=q.front();
q.pop();
if(o.x==t){
flag=1;
cut=min(cut,o.pl);
continue;
}
for(int i=0;i<pf[o.x].size();i++){
node w;
w.x=o.x+pf[o.x][i];
w.pl=o.pl+1;
if(w.x<=t && !vis[w.x])
vis[w.x]=1,q.push(w);
}
}
}
int main(){
getPri();
int T,cas=1;
cin>>T;
while(T--){
cin>>s>>t;
cout<<"Case "<<cas++<<": ";
if(s==t)
cout<<"0"<<endl;
else if(!pri[s]||!pri[t]){
cout<<"-1"<<endl;
}
else{
flag=0;cut=INF;
bfs();
if(flag)
cout<<cut<<endl;
else
cout<<"-1"<<endl;
}
}
return 0;
}