判斷整除 動態規劃,遞推

2022-07-03 17:09:13 字數 1384 閱讀 9588

總時間限制: 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

//

特別感謝

//#include#define ll long long

using

namespace

std;

ll f[

10001][1001],a[10001

];/*

把陣列定義在int main()外面,初始值為0

陣列a用來待會存入輸入資料

陣列f是二元陣列,從上往下代表乙個個處理a[1],a[2]...

從左到右是和求餘(取模)有關,下幾行再講

*/int

main()

*/f[i][((j-a[i])%k+k)%k]=1

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

;

/*那為什麼**寫那麼複雜,((j-a[i])%k+k)%k,要%那麼多次???

那是因為j-a[i]可能%k是負數,但是這個數+k肯定大於0

然後再%k就是正數了

假如不這麼做,並且j-a[i]是負數

他若是直接%k得到的也是個負模,那陣列下標j就撐不住負數了

*/}///輸出環節

if(f[n][0]) cout<<"

yes"

0號位為1即模為0

else cout<<"no"

}

動態規劃 遞推

hdu2044 1到n的路徑數f n 有兩種 f n 1 的路徑,f n 2 的路徑 編號a到b的蜂房可以看作編號1到b a的蜂房 include using namespace std long long f 55 int n int main int a,b cin n while n retu...

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 所有結...

遞迴 遞推 動態規劃

問題一 已知f 1 1 f 2 1 且f n f n 1 f n 2 則f n 等於多少?解法一 遞迴 找到遞迴關係和遞迴出口 include using namespace std int n int sum int i int main 解法二 遞推 include using namespac...