Advertisement
Guest User

Untitled

a guest
Oct 7th, 2014
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <stdio.h>
  6. #include <map>
  7. #include <set>
  8. #include <string>
  9. #include <cstring>
  10. #define tr 1000000007
  11. #define mp make_pair
  12. #define pb push_back
  13. #define tA 555
  14. #define tB 666
  15. #define AorB 777
  16. typedef long long ll;
  17. using namespace std;
  18. ll a[150],s,part[50][50],n,m,j,p,l,r,x,y,k1,k2,k3,k4,k,i,cur,rez,kokoko;
  19. map <ll,ll> f[40];
  20. map <ll,ll>::iterator itr;
  21.  
  22. int main()
  23. {
  24. cin >> n >> s;
  25. for (i = 0; i < n; i++)
  26. cin >> a[i];
  27. for (i = 0; i < n; i++)
  28. {
  29. k = 1LL;
  30. for (j = i; j < n; j++)
  31. if (k > s )
  32. part[i][j] = -1;
  33. else
  34. {
  35. k *= (ll)a[j];
  36. part[i][j] = k;
  37. }
  38. }
  39. f[0][0] = 1LL;
  40. for (i = 0; i < n/2; i++)
  41. for (itr = f[i].begin(); itr!=f[i].end(); itr++)
  42. {
  43. ll cnt = (*itr).first;
  44. for (j = i; j < n/2; j++)
  45. if (part[i][j] == -1||cnt + part[i][j] > s)
  46. break;
  47. else
  48. f[j+1][cnt+part[i][j]] += f[i][cnt];
  49. }
  50. f[n+1][s] = 1LL;
  51. for (i = n+1; i >= n/2+2; i--)
  52. for (itr = f[i].begin(); itr!=f[i].end(); itr++)
  53. {
  54. ll cnt = (*itr).first;
  55. for (j = i; j >= n/2+2; j--)
  56. if (part[j-2][i-2] == -1||cnt - part[j-2][i-2] < 1)
  57. break;
  58. else
  59. f[j-1][cnt-part[j-2][i-2]] += f[i][cnt];
  60. }
  61. rez = 0;
  62. for (i = 0; i < n/2; i++)
  63. for (itr = f[i].begin(); itr!= f[i].end(); itr++)
  64. {
  65. ll cnt = (*itr).first;
  66. for (j = n/2+1; j <= n+1; j++)
  67. rez += (ll)f[i][cnt]*f[j][cnt+part[i][j-2]];
  68. }
  69. cout << rez << endl;
  70. return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement