1. 程式人生 > >所以我也想玩這個序列遊戲

所以我也想玩這個序列遊戲

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; 27
for(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 }