求助本地良好但luoguideRE
  • 板块学术版
  • 楼主_8008008
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/1/5 18:51
  • 上次更新2024/1/5 21:21:20
查看原帖
求助本地良好但luoguideRE
803885
_8008008楼主2024/1/5 18:51

哪里溢出的 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;
}
2024/1/5 18:51
加载中...