中文描述:
问题描述
给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO
输入描述
输入文件的第一行有一个正整数T(1≤T≤10),表示数据组数。 接下去有T组数据,每组数据的第一行有两个正整数n,m (1≤n≤100000 ,1≤m≤5000). 第二行有n个正整数x (1≤x≤100)表示这个数列。
输出描述
输出T行,每行一个YES或NO。
输入样例
2 3 3 1 2 3 5 7 6 6 6 6 6
输出样例
YES NO
#include <iostream>
#include <string.h>
using namespace std;
const int N=100005;
int a[N];
int main(){
int t;
scanf("%d",&t);
int n,m;
while(t--){
bool flag=false;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
// a[i]%=m; //会节省时间
}
for(int i=0;i<n;i++){
int sum=0;
for(int j=i;j<n;j++){
sum+=a[j];
if(sum%m==0) {
flag=true;
break;
}
}
if(flag) break;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
这一题居然直接暴力不会T。。我感到十分震惊→_→;
节省实践的方法是在输入时对每个数字对m取模,如果取模相加和能整除,也一定能整除;
取模的时间是15ms,直接暴力是190+ms,所以优化起来肯定还是取模比较好;