POJ 2499 Binary Tree
http://poj.org/problem?id=2499
题意:从(1,1)开始
向左走为(2,1),向右走为(1,2)
规律是 (m,n)
向左走为(m+n,n),向右走为(m,n+m)
求 要走到所给坐标 需要向左走多少步,向右走多少步;
思路:手写几步找下规律
逆向思维,从(m,n)到(1,1)。
给定(m,n),求其上一坐标,如果m>n,则上一坐标是(m-n,n),
否则(m,n-m)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 int main() 3 { 4 int n,m,t; 5 int left,right,i=1; 6 scanf("%d",&t); 7 while(t--) 8 { 9 left=right=0; 10 scanf("%d%d",&n,&m); 11 while(n!=1 || m!=1) 12 { 13 14 if(n>m) 15 { 16 n=n-m; 17 left++; 18 } 19 else 20 { 21 m=m-n; 22 right++; 23 } 24 } 25 printf("Scenario #%d:\n%d %d\n\n",i++,left,right); 26 } 27 return 0; 28 }
换个思路:
规律又有,当m>n时;
向左走的次数为m%n 所到坐标为(m%n,n)
特殊情况,当m%n==0的时候(即当n==1时)
向左走的次数为m/n-1
当m<n时 类似、
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int main() 3 { 4 int a,h,n,m,l,r;; 5 scanf("%d",&a); 6 for(h=1;h<=a;h++) 7 { 8 scanf("%d %d",&m,&n); 9 { 10 l=r=0; 11 while(m!=1||n!=1) 12 { 13 if(m>n) 14 { 15 if(n==1) 16 { 17 l=l+m/n-1; 18 m=1; 19 } 20 else 21 { 22 l=l+m/n; 23 m=m%n; 24 } 25 26 } 27 else 28 {if(m==1) 29 { 30 r=r+n/m-1; 31 n=1; 32 } 33 else 34 { 35 r=r+n/m; 36 n=n%m; 37 } 38 39 } 40 } 41 printf("Scenario #%d:\n%d %d\n\n",h,l,r); 42 } 43 } 44 return 0; 45 }