對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號'+'或'-',這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列: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" ,行首行末應沒有空格。
每個數只有兩種操作,加上或者減去,是揹包
但是不能把揹包容量放太大,得想辦法優化。首先觀察一下資料,正確的複雜度應該是\(o(mnk)\)
我們發現把乙個數mod k其實是等價的,在最開始是這樣,做的過程也是這樣。
負數呢?如果我們做了負數,我們會發現它和正數的可達性是一樣的。當然我們不能不從負數轉移,這時候也是取膜放成正數就可以啦
code:
#include #include int max(int x,int y)
int abs(int x)
int dp[2][103],num,n,k,m;
int main()
if(dp[n&1][0])
printf("divisible\n");
else
printf("not divisible\n");
}return 0;
}
2018.7.9 (隨機演算法)洛谷P1356 數列的整除性
隨機演算法的核心就是隨機 感覺像說了句廢話 但是當隨機的次數足夠多的時候,往往能夠在很高的機率上 碰 到正確答案。基本框架是隨機進行決策,然後生成結果。注意,隨機演算法往往是決策隨機而不是每次生成的結果隨機,結果還是要保證是合法結果的,比如本題每次雖然加減是隨機進行的,但是結果都是合法結果,再此基礎...
P1356 數列的整除性
dp百題進度條 2 100 題目鏈結 題目描述 對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號 或 這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列 17,5,21,15,那麼就可以構造出8個表示式 17 5 21 15 16 17 5 21 15 14 1...
洛谷P1415 拆分數列 解題思路
因為某些申必原因被刪除 題目描述 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 輸入輸出格式 輸入格式 共一行...