牛客練習賽35-函式的魔法-floyd
阿新 • • 發佈:2019-01-13
思路 :如果 可以從A到B最終 都會是233範圍內的數字進行轉換,注意 這裡 建圖 為單向圖 這個運算未必符合交換關係。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define mod 233 #define maxn 300 int mp[maxn][maxn]; int n,t,a,b,ans,cpa; int f(int x){ x%=mod; return (x*x*x+x*x)%mod;} int g(int x){ x%=mod; return (x*x*x-x*x)%mod;} void init() { memset(mp,inf,sizeof(mp)); for(int i=0; i<mod; i++) { mp[i][f(i)]=1; mp[i][g(i)]=1; mp[i][i]=0; } for(int k=0; k<mod; k++) for(int i=0; i<mod; i++) for(int j=0; j<mod; j++) if(mp[i][k]!=inf&&mp[k][j]!=inf) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } int main() { scanf("%d",&t); init(); while(t--) { scanf("%d%d",&a,&b); if(a==b)printf("0\n"); else if(b>=mod)printf("-1\n"); else { cpa=289; ans=0; if(a>=mod) { cpa=f(a); a=g(a); ans++; } if(mp[a][b]<inf||mp[cpa][b]<inf) { ans+=min(mp[a][b],mp[cpa][b]); printf("%d\n",ans); } else printf("-1\n"); } } return 0; }