Divisibility

<问题分析>

利用性质 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\n");
30     else
31        printf("Not divisible\n");
32     } 
33     return 0;
34 }

 

posted @ 2013-07-05 22:01  simplesslife  阅读(184)  评论(0编辑  收藏  举报