1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| #include<bits/stdc++.h> #define mp make_pair #define pb push_back using namespace std; int const p=1e9+7; typedef pair<int,int> pii; int pw(int x,int y) { int res=1; while(y) { if(y&1)res=1ll*res*x%p; x=1ll*x*x%p; y>>=1; } return res; } bool cmp(int x,int y){return x>y;} void mod(int &x){if(x>=p)x-=p;} int n,a[45],head[25],r[45],g[45],c[45][45],e[45][45]; vector<int>v[2],buc[25]; vector<pii>q; void add(int x,int y){e[x][y]--,e[y][x]--,e[x][x]++,e[y][y]++;} int det() { int ans=1; for(int i=1;i<n;i++) { for(int j=i+1;j<n;j++) if((!e[i][i])&&e[j][i]){swap(e[i],e[j]);ans=p-ans;break;} int inv=pw(e[i][i],p-2); for(int j=i+1;j<n;j++) { int t=1ll*e[j][i]*inv%p; for(int k=i;k<n;k++) e[j][k]-=1ll*e[i][k]*t%p,e[j][k]+=p,mod(e[j][k]); } } for(int i=1;i<n;i++)ans=1ll*ans*e[i][i]%p; return ans; } int main() { int limit,k=0; scanf("%d%d",&n,&limit); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]!=-1)k++; } sort(a+1,a+n+1,cmp); for(int i=1;i<=(k>>1);i++)v[0].pb(a[i]); for(int i=(k>>1)+1;i<=k;i++)v[1].pb(a[i]); for(int i=0;i<(1<<v[0].size());i++) { q.pb(mp(0,__builtin_popcount(i))); for(int j=0;j<v[0].size();j++) if(i&(1<<j))q[i].first+=v[0][j]; } sort(q.begin(),q.end()); for(int i=0;i<(1<<v[1].size());i++) { int t=__builtin_popcount(i); buc[t].pb(0); for(int j=0;j<v[1].size();j++) if(i&(1<<j))buc[t][buc[t].size()-1]+=v[1][j]; } for(int i=0;i<=v[1].size();i++) sort(buc[i].begin(),buc[i].end()),head[i]=buc[i].size(); for(int i=0;i<q.size();i++) { for(int j=0;j<=v[1].size();j++) { while(head[j]&&buc[j][head[j]-1]+q[i].first>limit)head[j]--; r[j+q[i].second]+=head[j],mod(r[j+q[i].second]); } } c[0][0]=1; for(int i=1;i<=n;i++) { c[i][0]=1; for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%p; } for(int s=0;s<=k;s++) { memset(e,0,sizeof(e)); for(int i=1;i<=k-s;i++) { for(int j=i+1;j<=k-s;j++) add(i,j); for(int j=k+1;j<=n;j++) add(i,j); } for(int i=k-s+1;i<=k;i++) for(int j=k+1;j<=n;j++) add(i,j); for(int i=k+1;i<=n;i++) for(int j=i+1;j<=n;j++) add(i,j); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(e[i][j]<0)e[i][j]+=p; g[s]=1ll*det()*c[k][s]%p; } int ans=0; for(int s=0;s<=k;s++) { int res=0; for(int i=s;i<=k;i++) res+=1ll*c[i][s]*(((i-s)&1)?p-1:1)%p*g[i]%p,mod(res); ans+=1ll*res*r[k-s]%p*pw(c[k][s],p-2)%p,mod(ans); } printf("%d",ans); return 0; }
|