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

2022-04-30 05:30:10 字數 1267 閱讀 5756

對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號'+'或'-',這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列: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 拆分數列 解題思路

因為某些申必原因被刪除 題目描述 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 輸入輸出格式 輸入格式 共一行...