A. XXXXX
问题:给出一个数组a,长度n,一个整数b。求区间之和不是b的倍数的最长子区间。
若:所有的数都是b的倍数,那无论a的那个子区间的和都是b的倍数。
若:a的总和不是b的倍数,那答案就是整个数组的长度。
若:a的总和是b的倍数,则从左往右找第一个不是b的倍数的数的下标x,从右往左找第一个不是b的倍数的数的下标y,然后取
m
a
x
(
n
−
l
e
n
(
[
1
,
x
]
)
,
l
e
n
(
[
1
,
y
)
)
)
max(n-len([1,x]), len([1,y)))
max(n−len([1,x]),len([1,y)))
解释一下第三个a的总和是b的倍数,那减去一个不是b的倍数的数,那剩下的就也不是b的倍数了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e5+10;
int a[N];
int main() {
ll t, n, x, sum, flag;
scanf("%lld", &t);
while(t--) {
sum = 0, flag = 0;
scanf("%lld%lld", &n, &x);
for(int i=1; i<=n; i++) {
scanf("%lld", &a[i]);
sum += a[i];
if(a[i] % x) flag = 1;
}
if(sum % x) printf("%lld\n", n);//总和不是b的倍数。
else {
if(!flag) printf("-1\n");//全是b的倍数
else {
ll i = 1, j = n;
while(a[j] % x == 0) j--;//从右往左找
while(a[i] % x == 0) i++;//从左往右找
printf("%lld\n", max(j-1, n-i));
}
}
}
return 0;
}