fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(0);
  7.  
  8. int N, M, K;
  9. cin >> N >> M >> K;
  10. vector<int> T(N);
  11. for(int i=0;i<N;i++) cin >> T[i];
  12. vector<int> D(K);
  13. for(int i=0;i<K;i++) cin >> D[i];
  14.  
  15. const int MAXSUM = 1000*1000 + 10;
  16. bitset<MAXSUM> possible;
  17. possible[0] = 1;
  18.  
  19. for(int t : T) {
  20. bitset<MAXSUM> shifted = possible;
  21. for(int k=1;k<=M;k++) {
  22. shifted <<= t;
  23. possible |= shifted;
  24. }
  25. }
  26.  
  27. int ans = 0;
  28. int minD = D[0], maxD = D[K-1];
  29.  
  30. for(int F1 = 0; F1 + maxD < MAXSUM; F1++) {
  31. bool ok = true;
  32. // F1 + D[i] 모두 만들 수 있어야 함
  33. for(int i=0;i<K;i++){
  34. if(!possible[F1 + D[i]]) { ok = false; break; }
  35. }
  36. if(!ok) continue;
  37.  
  38. // 범위 내에서 D에 없는 값이 만들어지면 안됨
  39. for(int diff = minD; diff <= maxD; diff++){
  40. if(!binary_search(D.begin(), D.end(), diff)){
  41. if(possible[F1 + diff]) { ok = false; break; }
  42. }
  43. }
  44. if(ok) ans++;
  45. }
  46. cout << ans << "\n";
  47. }
Success #stdin #stdout 0.01s 5292KB
stdin
2 3 2
1 3
0 2
stdout
0