<问题分析>
利用性质 A*B mod C= (A mod C*B mod C) mod C
(A+B) mod C = (A mod C+B mod C) mod C
状态转移方程 s[i,(j-a[i] mod k) mod k]=s[i-1,j] (s[i-1,j]=1)
s[i,(j+a[i] mod k) mod k]=s[i-1,j] (s[i-1,j]=1)
1 #include <stdio.h> 2 #include <string.h> 3 4 5 int main() 6 { 7 int l,i,j,k,n,tag,v[10001],s[2][201]; 8 scanf("%d",&l); 9 while(l--!=0) 10 { 11 scanf("%d %d",&n,&k); 12 for(i=1;i<=n;i++) 13 scanf("%d",&v[i]); 14 memset(s[1],0,sizeof(int)*201); 15 s[1][v[1]%k+k]=1; 16 for(i=2;i<=n;i++) 17 { 18 memset(s[i%2],0,sizeof(int)*k*2); 19 for(j=0;j<=2*k;j++) 20 { 21 if(s[(i-1)%2][j]) 22 { 23 s[i%2][(j-k+v[i]%k)%k+k]=1; 24 s[i%2][(j-k-v[i]%k)%k+k]=1; 25 } 26 } 27 } 28 if(s[n%2][k]) 29 printf("Divisible "); 30 else 31 printf("Not divisible "); 32 } 33 return 0; 34 }