题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5776
求是否有区间的和是m的倍数
预处理前缀和,一旦有两个数模m的值相同,说明中间一部分连续子列可以组成m的倍数。
证明:若 x % m = b 且 y % m = b,那么x可以写成x = a1 * m + b,y可以写成y = a2 * m + b,(y - x) % m = ((a2 - a1) * m) % m = 0
假设1-n个数 sum【1-i】%m=sum【1-j】%m 所以sum【1-j】-sum【1-i】%m=0;
所以存在区间的和是m的倍数
#include"iostream" #include"cstring" using namespace std; const int N=100000; int sum[N]; int ans[N]; int main(){ int t,n,m; cin>>t; while(t--){ cin>>n>>m; bool flag=false; memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); ans[0]=1; for(int i=1;i<=n;i++){ cin>>sum[i]; sum[i]=(sum[i-1]+sum[i])%m; ans[sum[i]]++; } for(int i=0;i<=n;i++) if(ans[i]>1) flag=true; if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
时间: 2024-11-10 14:40:44