Ducci Sequence UVA - 1594

語言: CN / TW / HK

  A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1*,a2,···,an*), the next n-tuple in the sequence is formed by taking the absolute differences of neighboring integers:

(a1*,a2,···,an*) → (|a1 − a2|,|a2 − a3|,···,|ana1|)

  Ducci sequences either reach a tuple of zeros or fall into a periodic loop. For example, the 4-tuple sequence starting with 8,11,2,7 takes 5 steps to reach the zeros tuple:

(8*,11,2,7) → (3,9,5,1) → (6,4,4,2) → (2,0,2,4) → (2,2,2,2) → (0,0,0,0).*

The 5-tuple sequence starting with 4,2,0,2,0 enters a loop after 2 steps:

(4*,2,0,2,0) → (2,2,2,2,4) → (0,0,0,2,2) → (0,0,2,0,2) → (0,2,2,2,2) → (2,0,0,0,*2) →

(2*,0,0,2,0) → (2,0,2,2,2) → (2,2,0,0,0) → (0,2,0,0,2) → (2,2,0,2,2) → (0,2,2,0,*0) →

(2*,0,2,0,0) → (2,2,2,0,2) → (0,0,2,2,0) → (0,2,0,2,0) → (2,2,2,2,*0) → (0,0,0,2,2) → ···

  Given an n-tuple of integers, write a program to decide if the sequence is reaching to a zeros tuple or a periodic loop.

Input

  Your program is to read the input from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case starts with a line containing an integer n (3 ≤ n ≤ 15), which represents the size of a tuple in the Ducci sequences. In the following line, n integers are given which represents the n-tuple of integers. The range of integers are from 0 to 1,000. You may assume that the maximum number of steps of a Ducci sequence reaching zeros tuple or making a loop does not exceed 1,000.

Output

  Your program is to write to standard output. Print exactly one line for each test case. Print ‘LOOP’ if the Ducci sequence falls into a periodic loop, print ‘ZERO’ if the Ducci sequence reaches to a zeros tuple.

Sample Input

4
4
8 11 2 7
5
4 2 0 2 0
7
0 0 0 0 0 0 0
6
1 2 3 1 2 3

Sample Output

ZERO
LOOP
ZERO
LOOP

HINT

 採用思路時使用兩個數才存儲,其中一個用於計算,另一個用於判斷結束,也就是排序找出最大值,如果過最大值為0那就不是循環。另外還要計算判斷次數。耗時370ms。

Accepted

#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;


int main()
{
	int m, n,t,i;
	cin >> m;
	while (m--) {
		cin >> i;
		n = i;
		vector<int>arr,arr2;
		while (i--)
		{
			cin >> t;
			arr.push_back(t);
			arr2.push_back(t);
		}
		for (i = 1;;i++)
		{
			t = arr[0];
			
			for (int j = 0;j < n - 1;j++)
				arr[j]= arr2[j] = abs(arr[j] - arr[j + 1]);
			arr[n - 1] = arr2[n - 1] = abs(arr[n - 1] - t);
			if (i > 1000) {
				cout << "LOOP" << endl;
				break;
			}

			sort(arr2.begin(), arr2.end());
			if (!arr2[arr2.size() - 1])break;
		}
		if (i <= 1000)cout << "ZERO" << endl;
	}
}