A. XXXXX(codeforces)

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(nlen([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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_45363113/article/details/106797393