【LightOJ 1141 - Number Transformation】+ BFS

    xiaoxiao2021-03-25  43

    1141 - Number Transformation PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB 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 s to 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 Output for Sample Input 2 6 12 6 13 Case 1: 2 Case 2: -1

    题意 : A 可以通过 + A 非本身的质因子,成为 B ,给出 s 和 t,判断 s 是否可以转换成 t

    思路 : 预先统计出1~1e3每个数的质因子,如果 s == t,自然是一,如果s 和 t 其中一个是 质数者必定为 -1,其他 BFS

    AC代码:

    #include<cstdio> #include<queue> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int MAX = 1e3 + 10; const int INF = 0x3f3f3f3f / 2; typedef long long LL; int p[MAX],vis[MAX],s,t,ok,cut; vector <int> v[MAX]; struct node{ int x,pl; }; void init(){ // 查找每个数的质因子 p[1] = 1; for(int i = 2; i < MAX; i++) for(int j = i + i; j < MAX; j += i) p[j] = 1; for(int i = 2; i < MAX; i++) for(int j = 2; j < i; j++) if(i % j == 0 && !p[j]) v[i].push_back(j); } void bfs(){ memset(vis,0,sizeof(vis)); queue <node> q; vis[s] = 1; node o; o.x = s,o.pl = 0; q.push(o); while(!q.empty()){ o = q.front(); q.pop(); if(o.x == t){ ok = 1,cut = min(cut,o.pl); continue; } for(int i = 0; i < v[o.x].size(); i++){ node w; w.x = o.x + v[o.x][i],w.pl = o.pl + 1; if(w.x <= t && !vis[w.x]) vis[w.x] = 1,q.push(w); } } } int main() { init(); int T,nl = 0; scanf("%d",&T); while(T--){ scanf("%d %d",&s,&t); if(s == t) printf("Case %d: 0\n",++nl); else if(!p[s] || !p[t]) printf("Case %d: -1\n",++nl); else{ ok = 0,cut = INF; bfs(); if(ok) printf("Case %d: %d\n",++nl,cut); else printf("Case %d: -1\n",++nl); } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-30441.html

    最新回复(0)