题意
给定数组a,查找其最长子数组的长度,以便其元素之和不能被x整除,或者确定这样的子数组不存在。
数组a是数组b的子数组:如果a可以从b从开头删除几个(可能是零或全部)元素,从结尾删除几个(可能是零或全部)元素。
Input
3
3 3
1 2 3
3 4
1 2 3
2 2
0 6
Output
2
3
-1
Hint
在第一个测试用例中,子数组[2,3]元素之和5,不能被3整除.
在第二个测试用例中,整个数组的元素之和是6,不能被4整除.
在第三个测试用例中,所有子数组都有一个偶数和,所以答案是−1.
题解
如果这个序列总和可以整除给定的x的话,那么我们只要找到一个数可以不被x整除,把他从序列中取出,那么序列中剩余的总和也就不能被整除了。分别从前从后开始枚举取较大值即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>
using namespace std;
#define ios ios::sync_with_stdio(false)
int dx[]={-1,0,1,0,0},dy[]={0,1,0,-1,0};
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
typedef pair<double,int> pdi;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=1e5+10;
int a[N];
int n,x;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>x;
int ans=-1;
int sum=0;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
sum+=a[i];
if(sum % x) ans=max(ans,i+1);
}
sum=0;
for(int i=n-1;i>=0;i--)
{
sum+=a[i];
if(sum % x) ans=max(ans,n-i);
}
cout<<ans<<endl;
}
// system("pause");
}