http://162.105.81.212/JudgeOnline/problem?id=1745 第二次挤进第一版,同时挤进一千,从Dominoes 和Coins 得到的启示,k同余等价类,每次状态只在除k余数相同的数之间转移 #include <iostream> using namespace std ; int n , k , num[110] ; bool f[110] ; void Readin () { int i , sum , v ; scanf ("%d%d" , &n , &k) ; memset (num , 0 , sizeof (num)) ; memset (f , false , sizeof (f)) ; for (i = sum = 0 ; i < n ; i ++) { scanf ("%d" , &v) ; v = abs (v) ; sum += v ; num[(v << 1) % k] ++ ; } sum %= k ; if (sum) sum = k - sum ; f[sum] = true ; } void Comp () { int i , j , a[110] ; bool update ; for (i = 1 ; i < k && !f[0] ; i ++) if (num[i]) { for (j = 0 ; j < k ; j ++) if (f[j]) a[j] = num[i] ; else a[j] = 0 ; update = true ; while (update) { update = false ; for (j = 0 ; j < k ; j ++) if (!f[j] && a[(j + k - i) % k]) { f[j] = update = true ; a[j] = a[(j + k - i) % k] - 1 ; } } } if (f[0]) printf ("Divisible/n") ; else printf ("Not divisible/n") ; } int main () { Readin () ; Comp () ; return 0 ; }