蒟蒻90分求助,求帮忙卡常
查看原帖
蒟蒻90分求助,求帮忙卡常
135258
charm1楼主2021/3/9 09:24

RT

#include <bits/stdc++.h>
#define int unsigned int
using namespace std;
const int maxn=15;
const int dd=(int)(1e9)+7;
short n;
int k;
short a[maxn],sum[maxn];
int p[maxn];
unordered_map <int,int> mem[maxn][maxn];
inline int read(){
	int ret=0,f=1;	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
inline bool pd(int x){return sum[x]>a[x];}
inline bool add(int x,int val,int &c){
	c+=val*p[x];
	sum[x]+=val;
	return !pd(x);
}
int dfs(short x,short y,int c){
	int ans=0;
	if(mem[x][y].count(c))   return mem[x][y][c];
	if(x>n) return 1;   if(y>n) return a[x]==sum[x]?dfs(x+1,x+2,c):0;
	if((n-y+1)*3+sum[x]<a[x]||sum[x]>a[x])    return 0;
	if((n-y+1)*3+sum[x]==a[x]){
		if(add(x,(n-y+1)*3,c))	ans=dfs(x+1,x+2,c);
		add(x,-(n-y+1)*3,c);
		return ans;
	}
	if(sum[x]==a[x]){
		for(k=y;k<=n;k++)   add(k,3,c);
		ans=dfs(x+1,x+2,c);
		for(k=y;k<=n;k++) 	add(k,-3,c);
		return ans;
	}
	if(add(x,1,c)&&add(y,1,c))  ans+=dfs(x,y+1,c);  add(x,-1,c);    add(y,-1,c);
	if(add(y,3,c))	ans+=dfs(x,y+1,c); add(y,-3,c);
	if(add(x,3,c))	ans+=dfs(x,y+1,c); add(x,-3,c);
	return mem[x][y][c]=ans%dd;
}
void scan(){
	int k,j,i;
	n=read();   p[0]=1;
	for(k=1;k<=n;k++)   a[k]=read();
	for(k=1;k<=n;k++)   p[k]=dd*p[k-1];
	sort(a+1,a+n+1);
}
signed main(){
	scan(); printf("%u\n",dfs(1,2,0)%dd);
	return 0;
}
2021/3/9 09:24
加载中...