首页 > 代码库 > UVA - 11774 Doom's Day (规律)

UVA - 11774 Doom's Day (规律)

 

We all know about the legend oftower of Hanoi. It is said that the world will end after finishing the puzzle.What we don‘t know is another legend about when the world will end which is verifiedby the scientists.

 

It is all about a 3^n * 3^m grid.Initially the grid is filled with 1 to 3^(m+n) in row major order. At each stepthe puzzle is rearranged by reading it in row major order and putting them incollumn major order. See the following examples.

 

1

2

3

to

1

10

19

4

5

6

2

11

20

7

8

9

3

12

21

10

11

12

4

13

22

13

14

15

5

14

23

16

17

18

6

15

24

19

20

21

7

16

25

22

23

24

8

17

26

25

26

27

9

18

27

 

 

1

2

3

to

1

4

7

4

5

6

2

5

8

7

8

9

3

6

9

 

Now every day the puzzle is rearrangedonce. The legend says if someday initial configuration returns the world willend. Now you are wondering when the world is going to end.

 

Input

Input starts with a linecontaining number of test cases T ≤ 10000. Each test case containstwo positive integerm ≤  10^9and n≤ 10^9.

 

Output

For each case print one linecontaining days before dooms day. The input will be such that this number fitsin 64 bit unsigned integer.

 

SampleInput                                                 Outputfor Sample Input

5

1 1

1 2

3 1

2 2

98876767 12234

Case 1: 2

Case 2: 3

Case 3: 4

Case 4: 2

Case 5: 98889001

 

Problemsetter:Tanaeem Md. Moosa

SpecialThanks to: Jane Alam Jan

题意:往3^n * 3^m的格子里1到3^(n+m) 的数,每次的操作是:将数按行优先拿出来,再按列优先放进去,求多少次后回到初始状态

思路:规律ans=(a+b)/gcd(a, b);

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

int gcd(int a, int b) {
	return b == 0 ? a : gcd(b, a % b);
}

int main() {
	int t, a, b, cas = 1;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &a, &b);	
		printf("Case %d: %d\n", cas++, (a+b)/gcd(a, b));
	}
	return 0;
}


UVA - 11774 Doom's Day (规律)