根据N和K的范围开了dp[100005][100]的数组来表示
DP[i][j]表示在进行了第I个数的操作后余数为J的情况是否存在
顺序进行更新即可
#include<stdio.h>
#include<string.h>
int dp[10005][105];
int mod(int n,int k)
{
n=n%k;
while (n<0) n+=k;
return n;
}
int main()
{
int n,k;
while (scanf("%d%d",&n,&k)!=EOF)
{
int i,j,a[10005]={0};
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++) scanf("%d",&a[i]);
dp[1][mod(a[1],k)]=1;
for (i=2;i<=n;i++)
{
for (j=0;j<=k-1;j++)
if (dp[i-1][j])
{
dp[i][mod((j+a[i]),k)]=1;
dp[i][mod((j-a[i]),k)]=1;
}
/*for (j=0;j<=k-1;j++) if (dp[i][j]) printf("%d ",j);
printf("\n");*/
}
if (dp[n][0]) printf("Divisible\n");else printf("Not divisible\n");
}
}