昨晚不知道为什么错,WA2 就跑路睡觉了,今天早上起来拍了半个小时还没拍出错,确实难拍,求大佬看下。
思路是:发现所有除 0,5 外的数都可以操作到 2,4,8,6 这个循环里,计算 i 到 2 需要加上的数值:add[10]={−1,1,0,9,18,−1,6,25,14,23};
比如 add[7]=25 就是 7→4→8→6→2
相当于 7→14→18→26→32,需要加 32−7=25。
而 add[0]=−1,add[5]=−1 即不可能达到。
将所有数的个位变成 2 之后,看十位奇偶性是否相同即可,因为 2,4,8,6 一圈增量是 20。
然后判断 能否全变成个位为 0 且全部相同的数就行。
如下图:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int MAXN=2e5+5;
int t,n,a[MAXN],b[MAXN],add[10]={-1,1,0,9,18,-1,6,25,14,23};
int main(){
t=read();
while(t--){
n=read();
int cnt=0;
for(int i=1;i<=n;++i){
a[i]=read();
if(a[i]==a[i-1])cnt++;
}
if(cnt==n-1){puts("YES");continue;}
cnt=0;
for(int i=1;i<=n;++i){
b[i]=a[i];
if(add[b[i]%10]==-1){cnt=-1;break;}
b[i]+=add[b[i]%10];
if((b[i]/10)&1)cnt++;
}
if(cnt==0||cnt==n){puts("YES");continue;}
cnt=0;
for(int i=1;i<=n;++i){
b[i]=a[i];
if(b[i]%5!=0){cnt=-1;break;}
if(b[i]%10!=0)b[i]+=5;
if(b[i]==b[i-1])cnt++;
}
if(cnt==n-1){puts("YES");continue;}
puts("NO");
}
return 0;
}