【lightoj】1141 - Number Transformation

    xiaoxiao2021-03-25  72

    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+s=B,s为A的质因子,最少需要重复多少次可以得到B 注意A''=A+s  s为新得到的A''的质因子,刚开始理解错了。。。

    code:

    #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define inf 0x3f3f3f3f using namespace std ; int a [ 1000 ] = { 1, 1 } ; int num [ 1000 ] ; void su ( ) {     memset (a, 0, sizeof (a ) ) ;     for ( int i = 2 ;i < 1010 ;i ++ ) {         if (a [i ] ) continue ;         for ( int j = 2 *i ;j <= 1000 ;j + =i )         a [j ] = 1 ;     } } void f ( int s, int t ) {     queue < int >q ;     memset (num, 0x3f, sizeof (num ) ) ; //初始化为无穷大     num [s ] = 0 ;     q. push (s ) ;     while ( !q. empty ( ) ) {         int v =q. front ( ) ;         q. pop ( ) ;         if (v ==t ) return ;         for ( int i = 2 ;i <v ;i ++ ) {         if (v %i == 0 &&a [i ] == 0 ) {             if (v +i >t ) break ;             if (num [i +v ] >num [v ] + 1 )             num [v +i ] =num [v ] + 1,             q. push (v +i ) ;         }     }     }     } int main ( ) {     int T,s,t ;     su ( ) ;     scanf ( "%d", &T ) ; int k = 1 ;     while (T -- )     {         scanf ( "%d%d", &s, &t ) ;         f (s,t ) ;         if (num [t ] ! =inf )     printf ( "Case %d: %d\n",k ++,num [t ] ) ;     else printf ( "Case %d: %d\n",k ++, - 1 ) ;     }     return 0 ;   }  

    转载请注明原文地址: https://ju.6miu.com/read-32287.html

    最新回复(0)