题目链接:https://vjudge.net/problem/UVA-1594
题意:
对于一个n元组(a1, a2, … , an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的 n 元组 (|a1-a2|, |a2-a3|, … , |an-a1|)。重复这个过程,得到的序列称之为 Ducci 序列。求Ducci数列如果在1000步以内循环了,就输出 LOOP,否则输出 ZERO
题解:
按照题意的方式求出 每个 n 元组,如果步数 >= 1000而还是没有出现全0,则应输出 LOOP(因为题目保证如果出现全0的话是在1000步以内。),否则输出ZERO,注意到 n <= 15,这样的数据运行起来绰绰有余。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <set>
#include <ctype.h>//isalpha,isdight,toupper
#include <map>
#include <sstream>
typedef long long ll;
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=20+5;
int a[maxn],b[maxn];
int main(){
int t,n;
cin>>t;
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int fg=1;
for(int cnt=0;;cnt++){
if(cnt>=1000){
fg=0;
break;
}
for(int i=1;i<n;i++){
b[i-1]=abs(b[i]-b[i-1]);
}
b[n-1]=abs(a[n-1]-a[0]);
bool zero =1;
for(int i=0;i<n;i++){
if(b[i]!=0)zero=0;
a[i]=b[i];
}
if(zero)break;
}
if(fg)puts("ZERO");
else puts("LOOP");
}
return 0;
}