标签:
Description
Input
Output
Sample Input
4 7 17 5 -21 15
Sample Output
Divisible
AC代码:
1 /*用dp[i][j]表示通过前i个数的运算得到的余数为j可不可能, 2 先看求a % k,如果a > k, 3 则a = n * k + b,(n * k + b) % k == 0 + b % k = a % k, 4 所以当a > k时,对求余数有影响的部分是不能被整除的部分, 5 因此对于每个数我们可以做 6 a[i] = a[i] > 0 ? (a[i] % k) : -(a[i] % k)的预处理, 7 然后就是在dp[i - 1][j]的情况下,推出下一状态, 8 下一状态有两种可能,加和减, 9 减的时候防止出现负数加上个k再取余, 10 初始化dp[0][a[0]] = true最后只要判断dp[n - 1][0] 11 及前n个数通过加减运算能否得到被k整除的值 12 注意第一个数字前边不能加符号,所以要单独处理。*/ 13 #include <cstdio> 14 #include <cstring> 15 int const MAX = 10005; 16 bool dp[MAX][105]; 17 int a[MAX]; 18 int main() 19 { 20 int n, k; 21 while(scanf("%d %d", &n, &k) != EOF){ 22 memset(dp, false, sizeof(dp)); 23 for(int i = 0; i < n; i++){ 24 scanf("%d", &a[i]); 25 a[i] = a[i] > 0 ? (a[i] % k) : -(a[i] % k); 26 } 27 dp[0][a[0]] = true; 28 for(int i = 1; i < n; i++) 29 for(int j = 0; j <= k; j++){ 30 if(dp[i - 1][j]){ 31 dp[i][(j + a[i]) % k] = true; 32 dp[i][(k + j - a[i]) % k] = true; 33 } 34 } 35 printf("%s\n", dp[n - 1][0] ? "Divisible" : "Not divisible"); 36 } 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/123tang/p/5754629.html