Poj-1745 Divisibility【題解報告】

題目鏈接
在這裏插入圖片描述這道題長的確實很像一道搜索題,但是數據範圍太大了搜索空間210k2^{10k},顯然搜索會爆掉,但是!我們可以發現KK值很小,這就是這道題的突破口,想要找到最終可以整除KK的運算結果,我們不妨只存儲每次運算結果對KK取模後的值,需要注意的是

17%7=3-17\%7=-3,負數難以存儲(我的邏輯比較混亂),我們將其轉化爲等價的形式(17%7+7)%7=4(-17\%7+7)\%7=4,這是一種非常常見的對取模進行正化的手段(a%k+k)%k(a\%k+k)\%k

#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");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章