NOIP2017普及组初赛问题求解第四题的解答方法

孩子要参加NOIP比赛了,在做真题测试,拿到2017的赛题,其中一道原题如下:

根据代码根据输入填写输出的试题:

#include using namespace std;
int main() { int n, m;
   cin >> n >> m; 

  int x = 1; int y = 1; int dx = 1; int dy = 1; int cnt = 0;
   while ( cnt  != 2) {

    cnt = 0;
     x= x + dx;
     y= y + dy;
     if (x == 1 || x == n) {

       ++cnt;
       dx = -dx;
     }
     if (y == 1 || y == m) { 

        ++cnt;
        dy = -dy;
     }
   }
   cout << x << " " << y << endl; return 0;
}

 

第一组输入 4,3  输出 ?

第二组输入2017,1014 输出什么

 

代码比较简单,x和y两个数值不断从小到大,再从大到小往复变化,同时到达边界结束,对于第一组输入4,3

 

次数

1

2

3

4

5

6

7

8

x

1

2

3

4

3

2

1

 

y

1

2

3

2

1

2

3

 

 

到达1,3结束,输出结果1,3没有问题

 

第二组输入2017,1014. 有些晕了。 度娘一番,找到一个答案如下:

NOIP2017普及组初赛问题求解第四题的解答方法_第1张图片

 

 

 

 

 

这个显然错啦。1014+1013可不等于2017啊,是2027 

 

琢磨了半天尝试如下方式解答:

把x,y想象成为一个小球的坐标,它运动到达边界的时候反弹,反弹到矩形边界的角点时候结束

在结束的情况下,必然有整数n和m使得

 n*(2017-1) = m*(1014-1)

2016是合数, 1013则是质数

所以n=1013,m=2016

也就是说,x经过1013次反弹,y经过2016次反弹他们才到达角点结束

x经过1013次运动,是奇数,所以出口的x坐标必然是2017

y经过2016次运动,是偶数,所以出口的y坐标必然是1

 

希望有更好的解释方式

 

你可能感兴趣的:(数学算法)