題目鏈接
這道題長的確實很像一道搜索題,但是數據範圍太大了搜索空間,顯然搜索會爆掉,但是!我們可以發現值很小,這就是這道題的突破口,想要找到最終可以整除的運算結果,我們不妨只存儲每次運算結果對取模後的值,需要注意的是
,負數難以存儲(我的邏輯比較混亂),我們將其轉化爲等價的形式,這是一種非常常見的對取模進行正化的手段。
#define inf 0x3f3f3f3f
#define vec vector<int>
#define ll long long
#define MAX 105
#define P pair<int,int>
bool pre[MAX], dp[MAX];
int a, N, K;
int main() {
while (scanf("%d %d", &N, &K) != EOF) {
memset(pre, 0, sizeof(pre));
pre[0] = 1;
for (int i = 0; i < N; i++) {
scanf("%d", &a);
memset(dp, 0, sizeof(dp));
for (int j = K; j >= 0; j--) {
if (pre[j]) {
dp[((j + a) % K + K) % K] = 1;
dp[((j - a) % K + K) % K] = 1;
}
}
memcpy(pre, dp, sizeof(dp));
}
if (dp[0])printf("Divisible\n");
else printf("Not divisible\n");
}
}