提交时间:2025-01-03 16:04:43

运行 ID: 35807

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; typedef long long ll; const int N=152; const int mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n;ll p[4]; ll f[N][N<<1][N<<1],g[N][N<<1][N<<1],h[N][N<<1][N<<1],s[N]; const int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1}; const ll inf=7e18,M=mod*1ll*(inf/mod); inline void ad(ll &x,ll y){x+=y;if(x>=inf)x-=M;} inline void sb(ll &x,ll y){x-=y;if(x<=-inf)x+=M;} void slv(){ n=read();up(i,0,3)p[i]=read(); f[0][N][N]=1; up(i,0,n){ up(j,0,N*2-1)up(k,0,N*2-1)if(f[i][j][k])f[i][j][k]%=mod; if(i==n)break; up(j,0,i)up(k,0,i-j){ for(int s1:{-1,1})for(int s2:{-1,1}){ int J=N+s1*j,K=N+s2*k; if(j==0&&s1==1)continue; if(k==0&&s2==1)continue; up(l,0,3){ int x=J+dx[l],y=K+dy[l]; ad(f[i+1][x][y],f[i][J][K]*p[l]); } } } } up(i,0,n)up(j,0,i)up(k,0,i-j){ for(int s1:{-1,1})for(int s2:{-1,1}){ int J=N+j*s1,K=N+k*s2; if(j==0&&s1==1)continue; if(k==0&&s2==1)continue; g[i][J][K]=f[i][J][K]; up(l,0,i-1)sb(g[i][J][K],g[l][J][K]*f[i-l][N][N]); g[i][J][K]%=mod;if(g[i][J][K]<0)g[i][J][K]+=mod; //g[i][J][K]=(g[i][J][K]+mod-g[l][J][K]*1ll*f[i-l][N][N]%mod)%mod; } } up(i,0,n){ s[i]=0; up(j,0,2*N-1)up(k,0,2*N-1)ad(s[i],g[i][j][k]); s[i]%=mod; }h[0][N][N]=1; up(i,0,n){ up(j,0,N*2-1)up(k,0,2*N-1)h[i][j][k]%=mod; if(i==n)break; up(j,0,N)up(k,0,N){ for(int s1:{-1,1})for(int s2:{-1,1}){ int J=N+j*s1,K=N+k*s2; if(j==0&&s1==1)continue; if(k==0&&s2==1)continue; int j_=N+(-j*s1),k_=N+(-k*s2); up(l,1,n-i)ad(h[i+l][J][K],g[l][J][K]*(s[i]+mod-h[i][j_][k_])); //(h[i+l][J][K]+=g[l][J][K]*1ll*(s[i]+mod-h[i][j_][k_])%mod)%=mod; } } } int ex=0;up(i,0,n)(ex+=s[i])%=mod; int ex2=ex; up(i,0,n)up(j,0,2*N-1)up(k,0,2*N-1)if(j!=N||k!=N)(ex2+=h[i][j][k]%mod*2%mod)%=mod; //cout<<ex<<" "<<ex2<<endl; cout<<(ex2-ex*1ll*ex%mod+mod)%mod; }int main(){ //freopen("kel.in","r",stdin); //freopen("kel.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }