牛客練習賽35 C 函式的魔法 bfs
阿新 • • 發佈:2018-12-31
題目:
連結: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; }