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