因为是从(0,0)点开始以1,3,9,27,....的步数走的
其实可以每走一步后,以机器人为中心,平面所有坐标全部缩小3倍
那么本应该走3步的路现在只需要走1步就可以到达那个点
那么对于机器人来说这种变化意味着什么
走一步,缩小3倍,再走一步,再缩小3倍
以原点(0,0)为参照物,机器人走的距离确实是以1,3,9,27,...递增的
但是以机器人为参照物的话,每次它都只走了1步
然后,考虑在某个时刻,机器人和它的目标坐标(x,y)的相对坐标距离为(Δx,Δy)
因为接下来机器人要走的步数是1,3,9,...
因为有1的出现,所以Δx和Δy不可能同时是3的倍数,也不可能都不是3的倍数
如果出现了这种情况,直接输出Impossible
其余的,因为每次都会让接下来要走的步数/3
可能会出现类似-1-3+9的情况
这种情况下如果按照思路应该是-1/3-3/3+9/3=-1+3=2
但是如果直接进行整除
(-1-3+9)/3=5/3=1
不符合思路
所以需要将%3时先后为2,0,1的数归在一起
C语言的程序主要功能描述如下
1 x=abs(x);
2 y=abs(y);
3 while(x>0||y>0){
4 if(x%3==0&&y%3==0||x%3&&y%3)
5 break;
6 x=(x+1)/3;
7 y=(y+1)/3;
8 }
但是题目数据范围在1e500内
需要开高精度或者使用Python或Java
下面展示Java程序作为参考
1 /*
2 Written By StelaYuri
3 */
4 import java.util.Scanner;
5 import java.math.BigInteger;
6 public class Main
7 {
8 public static void main(String[] args)
9 {
10 Scanner in=new Scanner(System.in);
11 BigInteger a=new BigInteger(in.next()).abs(),b=new BigInteger(in.next()).abs(),j1,j2;
12 BigInteger c0=BigInteger.ZERO,c1=BigInteger.ONE,c2=new BigInteger("2"),c3=new BigInteger("3");
13 boolean jd=true;
14 while(jd&&(a.compareTo(c0)!=0||b.compareTo(c0)!=0)){
15 j1=a.remainder(c3);
16 j2=b.remainder(c3);
17 if((j1.compareTo(c0)==0)==(j2.compareTo(c0)==0)){
18 jd=false;
19 break;
20 }
21 a=a.add(c1).divide(c3);
22 b=b.add(c1).divide(c3);
23 }
24 if(jd)
25 System.out.println("Possible\n");
26 else
27 System.out.println("Impossible\n");
28 }
29 }
来源:https://www.cnblogs.com/stelayuri/p/12235324.html