u028 數列的整除性

2022-09-14 18:21:10 字數 1680 閱讀 5867

time limit: 1 second

memory limit: 128 mb

對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號'+'或'-',這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列:17,5,-2,-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" ,行首行末應沒有空格。

2

4 717 5 -21 15

4 517 5 -21 15

divisible

not divisible

【題解】

這是一道動態規劃的問題。

設f[i][j]表示前i個數餘數為j的情況是否出現

則f[i+1][(j+a[i+1])%k] = f[i+1][(j+a[i+1])%k] || f[i][j];

f[i+1][|j-a[i+1]|%k] = 

f[i+1][|j-a[i+1]|%k] || f[i][j];

然後一開始,如果輸入的n個數字,出現負數,就直接取相反數改為正數就好。

這裡用到了同餘率(反正就是(a+b-c)  % k == ((a+b) %k - c)%k 這樣。因為我的題a掉了。所以這個等式應該是成立的。。

然後對於每乙個數字,只有加或減兩張情況。

然後之所以用餘數來表示,是因為餘數這個變數的k值不大,最大只有100.是適合用來作為狀態的。

如果f[n][0]為true,則表示這個數列能夠被整除。

【**】

#include #include bool f[10001][101];

int a[10001];

int m, n,k;

int main()

f[1][a[1] % k] = true;//第乙個數前的符號是不能改的。

for (int i = 2;i <= n;i++)

for (int j = 0;j <= k;j++)//其他數字的符號則可以改。

if (f[i - 1][j])

if (f[n][0])//如果前n個數的餘數為0.就表示這個數列能夠被整除。

printf("divisible\n");

else

printf("not divisible\n");

} return 0;

}

P1356 數列的整除性

dp百題進度條 2 100 題目鏈結 題目描述 對於任意乙個整數數列,我們可以在每兩個整數中間任意放乙個符號 或 這樣就可以構成乙個表示式,也就可以計算出表示式的值。比如,現在有乙個整數數列 17,5,21,15,那麼就可以構造出8個表示式 17 5 21 15 16 17 5 21 15 14 1...

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

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

小議口令卡和U盾的安全性 ZT

今天在別人的電腦上用網銀交支付寶充值,在網銀支付的時候出現了錯誤,錯誤提示很是籠統,只有乙個錯誤 其他什麼也沒說,而且我以前用網銀時也沒出現過這樣的錯誤,由於不是自己的電腦,無法確保電腦安全,於是就起了懷疑。此前也聽說有一些專門盜竊網銀的木馬就是偽造乙個錯誤以騙取使用者的密碼。我用的是工商銀行的網上...