题目大意:给定一个数x,和长度为n的数组,找出最短的子数组,使得子数组的和不能整除x,不存在这样的子数组输出-1。
题解:先考虑两种极端情况,第一种每个数都可以整除x那输出-1,第二种,原数列的和本就来就不能整除x那输出n。现在考虑第二种情况的一般情况,如果原数列和能整除x,我们必定要从左右两端删除一个数,而且要满足题意,这个数必须是不能整除x的,因为原数列和是可以整除x的,所以要满足数组长度最长,只删一个就行(同时删两个不能整除x的反而会有问题),以此类推,详见代码。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main(){
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
int sum1=0,sum2=0,flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum1+=a[i];
if(a[i]%x!=0)flag=1;
}
sum2=sum1;
if(flag==0){
cout<<-1<<endl;
continue;
}
if(sum1%x!=0){
cout<<n<<endl;
continue;
}
for(int l=1,r=n;l<=r;l++,r--){
if(a[l]%x==0)sum1-=a[l];
else {
cout<<n-l<<endl;
break;
}
if(a[r]%x==0)sum2-=a[r];
else {
cout<<r-1<<endl;
break;
}
}
}
}