Codeforces Round #649 (Div. 2) 参与排名人数11286
[codeforces 1364A] XXXXX 余数的拆分
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1364/problem/A
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
A - XXXXX | GNU C++17 | Accepted | 124 ms | 600 KB |
题目大意:将数组a自头删除连续元素(也可不删除元素),或自尾删除连续元素(也可不删除元素),或同时自头自尾删除连续元素(也可不删除元素),得到数组b,若b中连续的元素和不能整除x,求出连续元素的最大个数。
余数是0,可拆分为两个余数不为0.
样例分析如下
2 2
0 6
-1
a数组位置 1 2
a数组数值 0 6
a[i]%x 0 0
前缀和sum[i] 0 0
sum[2]==0
此种情况需特判
输出-1
3 4
1 2 3
3
a数组位置 1 2 3
a数组数值 1 2 3
a[i]%x 1 2 3
前缀和sum[i] 1 3 6
sum[3]%x!=0
此种情况需特判
输出3
3 3
1 2 3
3
a数组位置 1 2 3
a数组数值 1 2 3
a[i]%x 1 2 0
前缀和sum[i] 1 3 3
sum[3]%x==0
输出3
3 4
1 2 3
2
a数组位置 1 2 3
a数组数值 1 2 3
a[i]%x 1 2 3
前缀和sum[i] 1 3 6
sum[3]%x==0
此种情况可考虑找到sum[i]%x!=0,那么区间
[1,i],[i+1,n]内的连续和均不被x整除
AC代码如下
#include <cstdio>
#include <algorithm>
#define maxn 100010
using namespace std;
int a,sum[maxn];
void solve(){
int n,x,i,ans=-1;
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++)scanf("%d",&a),a%=x,sum[i]=sum[i-1]+a;
if(sum[n]==0){printf("-1\n");return;}//特判,每个a[i]全能整除x
if(sum[n]%x){printf("%d\n",n);return;}//特判,整串均不能整除x
for(i=1;i<=n;i++)//[1,n]区间的和能整除x
if(sum[i]%x)ans=max(ans,i),ans=max(ans,n-i);//[1,i],[i+1,n]区间内的和均不能被x整除
printf("%d\n",ans);
}
int main(){
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}