思路
- 题意:从a取一段最长子序列使得子序列的和不是k的倍数
- 做法:如果a中所有数字的和不是k的倍数,自然输出a就可以了,如果是k的倍数,那么只要减去一个不是k的倍数的数字即可,也就是说找到从左边开始第一个k的倍数,和从右边开始第一个k的倍数,判断一下那个减去后长即可。
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int main(){
int T;
cin >> T;
while(T--){
int n,k;
cin >> n >> k;
long long sum=0;
int be=-1;
int ed=-1;
for(int i=0;i<n;i++){
int x;
cin >> x;
sum+=x;
if(x&&x%k){
if(be==-1){
be=i;
ed=i;
}
ed=max(ed,i);
}
}
if(sum%k==0){
if(be==-1)cout << -1 << "\n";
else cout << max(n-be-1,ed) << "\n";
}else{
cout << n << "\n";
}
}
}