P1356 數列的整除性

2022-08-04 10:09:15 字數 1485 閱讀 9130

dp百題進度條[2/100]

題目鏈結

題目描述

對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號'+'或'-',這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列:17,5,-21,-15,那麼就可以構造出8個表示式:

17+5+(-21)+15=16

17+5+(-21)-15=-14

17+5-(-21)+15=58

17+5-(-21)-15=28

17-5+(-21)+15=6

17-5+(-21)-15=-24

17-5-(-21)+15=48

17-5-(-21)-15=18

對於乙個整數數列來說,我們能通過如上的方法構造出不同的表示式,從而得到不同的數值,如果該數值能夠被k整除的話,那麼我們就稱該數列能被k整除。 在上面的例子中,該數列能被7整除(17+5+(-21)-15=--14),但不能被5整除。現在你的任務是,判斷某個數列是否能被某數整除。

輸入格式

第一行是乙個整數m,表示有m個子任務。接下來就是m個子任務的描述。 每個子任務有兩行。第一行是兩個整數n和k(1<=n<=10000, 2<=k<=100),n和k中間有乙個空格。n 表示數列中整數的個數;k就是需要你判斷的這個數列是否能被k 整除。第二行是數列的n個整數,整數間用空格隔開,每個數的絕對值都不超過10000。

輸出格式

輸出檔案應有m 行,依次對應輸入檔案中的m 個子任務,若數列能被k 整除則輸出 "divisible",否則輸出 "not divisible" ,行首行末應沒有空格。

輸入輸出樣例

輸入 #1

24 7

17 5 -21 15

4 517 5 -21 15

輸出 #1

divisible

not divisible

思路一:正常的dp

0/1揹包,自己看就好惹

#include#includeusing namespace std;

const int maxn = 10005;

int x,k,n;

bool dp[maxn][1005];

inline int mod(int x)

int main()

}if (t == 0)

else

}return 0;

}

思路二(我很欽佩的一種做法):

隨機化演算法,完全看臉

#include#includeusing namespace std;

int a[10001];

int i,n,t,k,randomm,ans;

int main( )

if(ans%k==0)

}if(!flag) printf("not divisible\n");

}return 0;

}

(隨機演算法)洛谷P1356 數列的整除性

隨機演算法的核心就是隨機 感覺像說了句廢話 但是當隨機的次數足夠多的時候,往往能夠在很高的機率上 碰 到正確答案。基本框架是隨機進行決策,然後生成結果。注意,隨機演算法往往是決策隨機而不是每次生成的結果隨機,結果還是要保證是合法結果的,比如本題每次雖然加減是隨機進行的,但是結果都是合法結果,再此基礎...

洛谷 P1356 數列的整數性 解題報告

對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號 或 這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列 17,5,21,15,那麼就可以構造出8個表示式 17 5 21 15 16 17 5 21 15 14 17 5 21 15 58 17 5 21 15 ...

u028 數列的整除性

time limit 1 second memory limit 128 mb 對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號 或 這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列 17,5,2,15,那麼就可以構造出8個表示式 17 5 21 15 16 ...