O(∩_∩)O哈哈~ 今天大年初一了,好冷的说~
/*
zoj_2042 dp
简单dp dp[i][j]表示处理完前I个数,得到模M的值为J是否存在。
因为犯了个低级错误,wa了数次。。以下代码写成滚动数组形式了。
注意点:
1.所有数都要转化为%k的余数进行dp
2.负数%k是得到0或负数的
*/
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
bool flag[110],temp[110];
int num[10010];
int n,k;
int ope( int a,int b,int mark )
{
if( mark==0 ) return (a-b+k)%k;
return (a+b+k)%k;
}
int main()
{
int T,i,j;
scanf( "%d",&T );
while( T-- )
{
scanf( "%d%d",&n,&k );
for( i=0;i<n;i++ )
{
scanf( "%d",&num[i] );
num[i]=( num[i]%k+k )%k;
}
memset( flag,0,sizeof(flag) );
flag[ num[0] ]=true;
for( i=1;i<n;i++ )
{
memset( temp,0,sizeof(temp) );
for( j=0;j<k;j++ )
if( flag[j] )
{
temp[ ope(j,num[i],0) ]=true;
temp[ ope(j,num[i],1) ]=true;
}
memcpy( flag,temp,sizeof(temp) );
}
if( flag[0] ) printf( "Divisible\n" );
else printf( "Not divisible\n" );
if(T) printf( "\n" );
}
return 0;
}