1 条题解

  • 0
    @ 2024-12-24 9:14:33

    C++ :

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    #define mod 1000000007
    #define N 101
    int b[N],w[N];
    int n,k;
    LL R_b[N][N*N],R_w[N][N*N];
    void cal(int c[],LL R[][N*N]){
        memset(R,0,sizeof(R));
        for(int i=0;i<=n;i++) R[i][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=c[i];j++)
                R[i][j]=(R[i-1][j]+R[i-1][j-1]*(c[i]-(j-1)))%mod;
    }
    int main(){
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        while(scanf("%d%d",&n,&k)!=EOF){
            if(n==0 && k==0) break;
            memset(b,0,sizeof(b)),memset(w,0,sizeof(w));
            memset(R_w,0,sizeof(R_w)),memset(R_b,0,sizeof(R_b));
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    if((i+j)&1) w[(i+j)>>1]++;
                    else b[(i+j)>>1]++;
            sort(w+1,w+n),sort(b+1,b+n+1);
            cal(w,R_w),cal(b,R_b);
            LL ans=0;
            for(int i=0;i<=k;i++)
                ans=(ans+R_w[n-1][i]*R_b[n][k-i])%mod;
            printf("%lld\n",ans);
        }
        return 0;
    }
    
    

    Java :

    import java.math.*;
    import java.util.*;
    public class Main{
        public static void main(String args[]){
             Scanner in = new Scanner(System.in);
             while(in.hasNext()){
                 int n=in.nextInt();
                 int K=in.nextInt();
                 int w[]=new int[n];
                 int b[]=new int[n];
                 int num_w=0,num_b=0;
                 w[num_w++]=n;
                 for(int i=n-2;i>=1;i-=2){
                     w[num_w++]=i;
                     w[num_w++]=i;
                 }
                 for(int i=n-1;i>=1;i-=2){
                     b[num_b++]=i;
                     b[num_b++]=i;
                 }
                 Arrays.sort(w,0,num_w);
                 Arrays.sort(b,0,num_b);
                 BigInteger[][] dp=new BigInteger[2][n+1];
                 BigInteger[][] dq=new BigInteger[2][n+1];
                 for(int i=0;i<2;i++){
                     for(int j=0;j<=n;j++){
                         dp[i][j]=BigInteger.ZERO;
                         dq[i][j]=BigInteger.ZERO;
                     }
                 }
                 dp[0][0]=dq[0][0]=BigInteger.ONE;
                 int x=1,y=1;
                 for(int i=0;i<num_w;i++){
                     for(int j=0;j<=i+1;j++){
                         dp[x][j]=dp[x^1][j];
                     }
                     for(int j=1;j<=i+1 && w[i]-(j-1)>=0;j++){
                         dp[x][j]=dp[x][j].add(dp[x^1][j-1].multiply(BigInteger.valueOf(w[i]-(j-1))));
                     }
                     x^=1;
                 }
                 x^=1;
                 for(int i=0;i<num_b;i++){
                     for(int j=0;j<=i+1;j++){
                         dq[y][j]=dq[y^1][j];
                     }
                     for(int j=1;j<=i+1 && b[i]-(j-1)>=0;j++){
                         dq[y][j]=dq[y][j].add(dq[y^1][j-1].multiply(BigInteger.valueOf(b[i]-(j-1))));
                     }
                     y^=1;
                 }
                 y^=1;
                 BigInteger ans=BigInteger.ZERO;
                 for(int i=0;i<=num_w && i<=K;i++){
                     if(K-i<=num_b){
                        ans=ans.add(dp[x][i].multiply(dq[y][K-i]));
                     }
                 }
                 System.out.println(ans.mod(BigInteger.valueOf(1000000007)));
             }
        }
    }
    
    
    • 1

    信息

    ID
    610
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者