哪里溢出的 in
5 7
10 12 15 20 30
out
330
#include<iostream>
using namespace std;
const int maxn=55;
const int maxhash=10000000;
const int mod=1000000007;
int jiecheng(int x){
if(x==0)return 1;
int sum=1;
for(int i=2;i<=x;i++)sum*=i;
return sum;
}
int C(int n,int m){
return jiecheng(n)/(jiecheng(n-m)*jiecheng(m));
}
int ans,n,k,a[maxn];
bool h[maxhash][5];
bool flag=true;
void bff(){
k=min(k,n);
for(int i=1;i<=k;i++)ans=(ans+C(k,i))%mod;
}
bool HASH(){
int num[5];
for(int i=1;i<=n;i++){
num[0]=(66*num[0]+a[i]*4)%117554;
num[1]=(32*num[1]+a[i])%365352;
num[2]=(3*num[2]+a[i]*32)%3332;
num[3]=(94*num[3]+a[i]*32)%3132;
num[4]=(2*num[4]+a[i]*77)%432;
}
int flag=h[num[0]][0]&&h[num[1]][1]&&h[num[2]][2]&&h[num[3]][3]&&h[num[4]][4];
if(!flag){
h[num[0]][0]=h[num[1]][1]=h[num[2]][2]=h[num[3]][3]=h[num[4]][4]=true;
ans=(ans+1)%mod;
}
}
void dfs(int t,int l){//t=剩下的次数 l=深度
int copy=a[l];
for(int i=0;i<=t;i++){
a[l]=max(0,a[l]-i);
if(l==n-1){
int copy2=a[n];
a[n]=max(a[n]-t+i,0);
HASH();
a[n]=copy2;
}else dfs(t-i,l+1);
a[l]=copy;
}
}
void work(){
for(int i=1;i<=n;i++){
int cnt=0;
while(a[i])a[i]/=2,cnt++;
a[i]=cnt;
}
for(int i=0;i<=k;i++){
int copy=a[1];
a[1]=max(0,a[1]-i);
dfs(k-i,2);
a[1]=copy;
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]!=1)flag=false;
}
if(flag)bff();
else work();
printf("%d",ans);
return 0;
}