1. 程式人生 > >牛客練習賽35 C 函式的魔法 bfs

牛客練習賽35 C 函式的魔法 bfs

 題目:

連結:https://ac.nowcoder.com/acm/contest/326/C
來源:牛客網
 

題目描述

一位客人來到了此花亭,給了女服務員柚一個數學問題:我們有兩個函式,F(X)函式可以讓X變成(X*X*X+X*X)mod 233。G(X)函式可以讓X變成(X*X*X-X*X)mod 233,我們可以任意的對A使用F(X),和G(X),問最少需要多少次使用這兩個函式讓A變成B。

輸入描述:

第一行輸入一個T,表示T組案例(T<100000),然後輸入兩個整數A,B,表示我們需要把A變成B。(0<=A<=2000000000,0<=B<=2000000000)

輸出描述:

輸出一個整數表示從A到B最少需要多少次操作,如果不能請輸出-1.

示例1

輸入

複製

1
2 186

輸出

複製

2

說明

我們首先使用F(X),將2變成(2*2*2+2*2)mod 233=12。然後我們再將12通過G(X),變成(12*12*12-12*12)mod 233=186

 思路:

將求出的結果的餘數作為bfs的物件,進行bfs,注意第一次bfs時不需要進行取模,直接將原數壓入佇列即可,如果取模的話會發生等於0的情況,這樣結果就不對了。

程式碼如下:

#include <bits/stdc++.h>
using namespace std;
int t;
typedef long long ll;
int yu[250];
const ll mod=233;
struct data
{
    ll x;
    ll ci;
};
ll F (ll x)
{
    x%=mod;
    return (x*x*x+x*x)%mod;
}
ll G (ll x)
{
    x%=mod;
    return (x*x*x-x*x)%mod;
}
ll bfs(ll x,ll y)
{
    queue<data>q;
    data t;
    t.ci=0,t.x=x;
    q.push(t);
    while (!q.empty())
    {
        data now=q.front();
        q.pop();
        if(now.x==y)
        {
            return now.ci;
        }
        data next;
        next.ci=now.ci+1;
        next.x=F(now.x);
        if(yu[next.x]==0)
        {
            yu[next.x]++;
            q.push(next);
        }
        next.x=G(now.x);
        if(yu[next.x]==0)
        {
            yu[next.x]++;
            q.push(next);
        }
    }
    return -1;
}
int main()
{
    scanf("%d",&t);
    while (t--)
    {
        memset (yu,0,sizeof(yu));
        ll a,b;
        scanf("%lld%lld",&a,&b);
        if(a==b)
        {
            printf("0\n");
        }
        else if(b>=mod)
        {
            printf("-1\n");
        }
        else
        {
            printf("%lld\n",bfs(a,b));
        }
    }
    return 0;
}