1 solutions

  • 0
    @ 2025-11-5 17:34:26

    C++ :

    #define MAXN 1010UL
    #define MAXB 100UL
    #define B(a) (a+1)
    
    #include <cstdio>
    #include <cstring>
    
    inline int MAX(int a,int b){
    	return a>b?a:b;
    }
    
    struct BigNum{
    	int s[MAXB];
    	inline void clr(){memset(s,0,sizeof(s));return;}
    	inline void prx(){printf("%d",s[s[0]]);for(int i=s[0]-1;i>0;i--) printf("%08d",s[i]);return;}
    	inline void setnum(int p){while(p) s[++s[0]]=p%10,p/=10;return;}
    	friend BigNum operator + (BigNum temp_a,BigNum temp_b){
    		if(!temp_a.s[0]) return temp_b;
    		if(!temp_b.s[0]) return temp_a;
    		BigNum temp_c;temp_c.clr();
    		int i,j,*a=temp_a.s,*b=temp_b.s,*c=temp_c.s;
    		c[0]=MAX(a[0],b[0])+1;
    		for(i=1;i<c[0];i++){
    			c[i]+=a[i]+b[i];
    			if(c[i]>99999999) c[i]-=100000000,++c[i+1];
    		}
    		while(!c[c[0]]&&c[0]>1) --c[0];
    		return temp_c;
    	}
    };
    
    BigNum f[MAXN][MAXN];
    int n,s[MAXN],p[MAXN];
    bool ex[MAXN<<1];
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&s[i]),ex[s[i]]=true;
    	for(int i=1;i<=n;i++) scanf("%d",&p[i]),ex[p[i]]=true;
    	f[B(0)][B(0)].setnum(1);
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<=n;j++){
    			//h-1 i+1 num=i+j  0<=j<=i-1
    			if(i-1>=j) if((ex[i+j]&&s[i]==i+j)||((!ex[i+j])&&(!s[i]))) f[B(i)][B(j)]=f[B(i)][B(j)]+f[B(i-1)][B(j)];
    			//h-2 j+1 num=i+j   j<=i<=n
    			if(i>=j)   if((ex[i+j]&&p[j]==i+j)||((!ex[i+j])&&(!p[j]))) f[B(i)][B(j)]=f[B(i)][B(j)]+f[B(i)][B(j-1)];
    			//printf("%d %d->\n",i,j);
    			//f[B(i)][B(j)].prx();
    		}
    	}
    	f[B(n)][B(n)].prx();
    	return 0;
    }
    
    • 1

    Information

    ID
    18565
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By