思路 :如果 可以从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; }