所以我也想玩這個序列遊戲
阿新 • • 發佈:2018-12-09
Description
今天dxy休息,他想出了一個序列遊戲,具體描述如下:
你有一個長度為n的正整數序列和一個正整數m,問其中是否存在一個非空子區間使得這個子區間的區間和是m的倍數。
Input
多組資料,讀入到檔案結尾
對於每一組資料
第一行:兩個數n,m
第二行:n個正整數,表示題目中的序列
n<=10^6,m<=2000,0<a[i]<=10^9
Output
對於每組資料輸出一行:若存在所描述的區間,則輸出YES,否則輸出NO
思路
求字首和並對m取模,然後判斷當前“字首和”是否在之前出現過。如果出現了,說明存在某一區間的區間和是m的倍數。否則就是NO
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 typedef long long ll; 7 8 int n,m; 9 int a[1000050]; 10 int sum[1000050]; 11 bool vis[2050]; 12 int main() 13 { 14 while(scanf("%d%d",&n,&m)!=EOF)15 { 16 if(m==0) 17 { 18 for(int i=1; i<=n; i++) 19 { 20 scanf("%d",&a[i]); 21 } 22 printf("YES\n"); 23 continue; 24 } 25 memset(vis,0,sizeof(vis)); 26 int flag=0; 27for(int i=1; i<=n; i++) 28 { 29 scanf("%d",&a[i]); 30 if(flag) 31 { 32 continue; 33 } 34 sum[i]=sum[i-1]+a[i]; 35 sum[i]%=m; 36 if(sum[i]==0) 37 { 38 flag=1; 39 continue; 40 } 41 if(vis[sum[i]]) 42 { 43 flag=1; 44 continue; 45 } 46 vis[sum[i]]=1; 47 } 48 if(flag) 49 { 50 printf("YES\n"); 51 continue; 52 } 53 printf("NO\n"); 54 } 55 return 0; 56 }