对于一个
n
元组
(
a
1
,
a
2
, …,
a
n
)
,可以对于每个数求出它和下一个数的差的绝对值,得到
一个新的
n
元组
(|
a
1
-
a
2
|, |
a
2
-
a
3
|, …, |
a
n
-
a
1
|)
。重复这个过程,得到的序列称为
Ducci
序列,例如:
(8, 11, 2, 7) -> (3, 9, 5, 1) -> (6, 4, 4, 2) -> (2, 0, 2, 4) -> (2, 2, 2, 2) -> (0, 0, 0, 0).
也有的
Ducci
序列最终会循环。输入
n
元组(
3≤
n
≤15
),你的任务是判断它最终会变成
0
还是会循环。输入保证最多
1000
步就会变成
0
或者循环。
#include<iostream>
#include<cmath>
using namespace std;
main()
{
int t;
cin>>t;
while(t--)
{ int n,a[20],i,k;
cin>>n;
for( i=0;i<n;i++)
cin>>a[i];
for(k=0;k<1002;k++)
{ int ans=0;
int s=a[0],j;
for(j=0;j<n-1;j++)
{ a[j]=abs(a[j]-a[j+1]);
if(a[j]==0)
ans++;
}
a[j]=abs(a[j-1]-s);
if(a[j]==0)
ans++;
if(ans==4)
{ cout<<"NO";
break;
}
}
if(k>=1001)
cout<<"LOOP";
cout<<endl;
}
return 0;
}
#include<cmath>
using namespace std;
main()
{
int t;
cin>>t;
while(t--)
{ int n,a[20],i,k;
cin>>n;
for( i=0;i<n;i++)
cin>>a[i];
for(k=0;k<1002;k++)
{ int ans=0;
int s=a[0],j;
for(j=0;j<n-1;j++)
{ a[j]=abs(a[j]-a[j+1]);
if(a[j]==0)
ans++;
}
a[j]=abs(a[j-1]-s);
if(a[j]==0)
ans++;
if(ans==4)
{ cout<<"NO";
break;
}
}
if(k>=1001)
cout<<"LOOP";
cout<<endl;
}
return 0;
}