OpenJudge 3531 判斷整除

2021-08-02 20:41:41 字數 1548 閱讀 8794

總時間限制: 1000ms 記憶體限制: 65536kb

描述 乙個給定的正整數序列,在每個數之前都插入+號或-號後計算它們的和。比如序列:1、2、4共有8種可能的序列:

(+1) + (+2) + (+4) = 7

(+1) + (+2) + (-4) = -1

(+1) + (-2) + (+4) = 3

(+1) + (-2) + (-4) = -5

(-1) + (+2) + (+4) = 5

(-1) + (+2) + (-4) = -3

(-1) + (-2) + (+4) = 1

(-1) + (-2) + (-4) = -7

所有結果中至少有乙個可被整數k整除,我們則稱此正整數序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、-3、-6、-9……都可以認為是3的倍數。

輸入 輸入的第一行包含兩個數:n(2 < n < 10000)和k(2 < k< 100),其中n代表一共有n個數,k代表被除數。第二行給出序列中的n個整數,這些整數的取值範圍都0到10000之間(可能重複)。

輸出 如果此正整數序列可被k整除,則輸出yes,否則輸出no。(注意:都是大寫字母)

樣例輸入

3 2

1 2 4

樣例輸出

no這道題目講道理,感覺是一道數學題目,運用逐步取模的思想,減少陣列的開銷,同時也減小了時間的開銷,對於每乙個數字只有它本身和它的相反數的情況,所以在輸入的時候就先取模k,因為在加法中val[i]和val[i]%k的貢獻是一樣的,所以在輸入的時候就可以直接進行取模。

遞推操作如下:ans[i][j] 的i代表的是第i個數,j代表的是加上val[i]的兩種情況之後能夠算出的和%k之後的結果,那麼如果ans[i-1][j] 為真,就代表前i-1個數能夠算出來i,這樣我們就在這個數字的基礎上加上val[i]即可。

#include

#include

using

namespace

std;

bool ans[10002][105] = ;

int val[10005][2] = ;

int main()

memset(ans, 0, sizeof(ans));

ans[0][val[0][0]] = ans[0][val[0][1]] = true;

for (int i = 1; i < num; ++i)

for (int j = 0; j < k; ++j)

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

ans[i][(j + val[i][0]) % k] = ans[i][(j + val[i][1]) % k] = true;

if (ans[num - 1][0]) cout

<< "yes"

<< endl;

else

cout

<< "no"

<< endl;

system("pause");

return

0;}

3531 判斷整除

3531 判斷整除 總時間限制 1000ms 記憶體限制 65536kb 描述 乙個給定的正整數序列,在每個數之前都插入 號或 號後計算它們的和。比如序列 1 2 4共有8種可能的序列 1 2 4 7 1 2 4 1 1 2 4 3 1 2 4 5 1 2 4 5 1 2 4 3 1 2 4 1 1...

OpenJudge 判斷數字個數

描述 判斷一行字串中的數字出現的個數。輸入輸入有多行,每行乙個字串,該字串中可以包含 任何符號以及空格。輸出輸出有多行。輸出該字串中每個出現過的數字,然後在冒號 後面輸出該數字出現的次數。按數字大小,從小到大的順序輸出。一行輸出乙個數字及其出現次數。沒有出現過的數字不輸出。樣例輸入 ldksfj85...

3531 判斷整除(2 6基本演算法之動態規劃)

總時間限制 1000ms 記憶體限制 65536kb 描述 乙個給定的正整數序列,在每個數之前都插入 號或 號後計算它們的和。比如序列 1 2 4共有8種可能的序列 1 2 4 7 1 2 4 1 1 2 4 3 1 2 4 5 1 2 4 5 1 2 4 3 1 2 4 1 1 2 4 7 所有結...