Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <stdio.h>
- #include <map>
- #include <set>
- #include <string>
- #include <cstring>
- #define tr 1000000007
- #define mp make_pair
- #define pb push_back
- #define tA 555
- #define tB 666
- #define AorB 777
- typedef long long ll;
- using namespace std;
- ll a[150],s,part[50][50],n,m,j,p,l,r,x,y,k1,k2,k3,k4,k,i,cur,rez,kokoko;
- map <ll,ll> f[40];
- map <ll,ll>::iterator itr;
- int main()
- {
- cin >> n >> s;
- for (i = 0; i < n; i++)
- cin >> a[i];
- for (i = 0; i < n; i++)
- {
- k = 1LL;
- for (j = i; j < n; j++)
- if (k > s )
- part[i][j] = -1;
- else
- {
- k *= (ll)a[j];
- part[i][j] = k;
- }
- }
- f[0][0] = 1LL;
- for (i = 0; i < n/2; i++)
- for (itr = f[i].begin(); itr!=f[i].end(); itr++)
- {
- ll cnt = (*itr).first;
- for (j = i; j < n/2; j++)
- if (part[i][j] == -1||cnt + part[i][j] > s)
- break;
- else
- f[j+1][cnt+part[i][j]] += f[i][cnt];
- }
- f[n+1][s] = 1LL;
- for (i = n+1; i >= n/2+2; i--)
- for (itr = f[i].begin(); itr!=f[i].end(); itr++)
- {
- ll cnt = (*itr).first;
- for (j = i; j >= n/2+2; j--)
- if (part[j-2][i-2] == -1||cnt - part[j-2][i-2] < 1)
- break;
- else
- f[j-1][cnt-part[j-2][i-2]] += f[i][cnt];
- }
- rez = 0;
- for (i = 0; i < n/2; i++)
- for (itr = f[i].begin(); itr!= f[i].end(); itr++)
- {
- ll cnt = (*itr).first;
- for (j = n/2+1; j <= n+1; j++)
- rez += (ll)f[i][cnt]*f[j][cnt+part[i][j-2]];
- }
- cout << rez << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement