
Untitled
By: a guest on
Apr 15th, 2012 | syntax:
C++ | size: 0.85 KB | hits: 15 | expires: Never
#include <iostream>
#include <map>
#define MOD 1000000000
using namespace std;
int mass[40], pw[(1<<19)+1], totmass[1<<20];
map<int,int> cnt;
int main() {
int N,M,ans = 0;
scanf("%d%d",&N,&M);
for(int i=0;i<M;++i) scanf("%d",&mass[i]);
for(int i=0;i<20;++i) pw[1<<i] = i;
int M2 = M>>1;
totmass[0] = 0;
cnt[0] = 1;
for(int i=1;i<(1<<M2);++i) {
int lb = i&(-i);
if(totmass[i-lb] >= N) totmass[i] = N+1;
else totmass[i] = totmass[i-lb] + mass[pw[lb]];
cnt[totmass[i]]++;
}
for(int i=0;i<(1<<(M-M2));++i) {
if(i) {
int lb = i&(-i);
if(totmass[i-lb] >= N) totmass[i] = N+1;
else totmass[i] = totmass[i-lb] + mass[M2+pw[lb]];
}
ans += cnt[N-totmass[i]];
if(ans >= MOD) ans -= MOD;
}
printf("%d\n",ans);
}