社区讨论

萌新球问

P5694[NOI2001] 陨石的秘密参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhz47myi
此快照首次捕获于
2025/11/15 01:11
3 个月前
此快照最后确认于
2025/11/16 13:45
3 个月前
查看原帖
请问为何取模前和取模后的时间差这么多啊qwq
取模后代码
CPP
#include <bits/stdc++.h>
using namespace std;
int dp[35][35][35][35],dp1[35][35][35][35];
int l1,l2,l3,d;
int main(){
    scanf("%d%d%d%d",&l1,&l2,&l3,&d);
    dp[0][0][0][0]=1;
    dp1[0][0][0][0]=1;
    for (int i=1;i<=d;i++){
        for (int j=0;j<=l1;j++){
            for (int k=0;k<=l2;k++){
                for (int h=0;h<=l3;h++){
                    if (j+k+h==0){
                        continue;
                    }
                    for (int j1=0;j1<=j;j1++){
                        for (int k1=0;k1<=k;k1++){
                            for (int h1=0;h1<=h;h1++){
                                if (j1+k1+h1>0 && j1+k1+h1<j+k+h){
                                    for (int x=1;x<i;x++){
                                        dp[i][j][k][h]=(dp[i][j][k][h]+dp1[x][j1][k1][h1]*dp[i][j-j1][k-k1][h-h1]%11380)%11380;
                                        //dp[i][j][k][h]%=11380;
                                    }
                                    for (int x=1;x<i;x++){
                                        dp[i][j][k][h]=(dp[i][j][k][h]+dp1[i][j1][k1][h1]*dp[x][j-j1][k-k1][h-h1]%11380)%11380;
                                        //dp[i][j][k][h]%=11380;
                                    }
                                    dp[i][j][k][h]=(dp[i][j][k][h]+dp1[i][j1][k1][h1]*dp[i][j-j1][k-k1][h-h1]%11380)%11380;
                                    //dp[i][j][k][h]%=11380;
                                }
                            }
                        }
                    }
                    if (i){
                        if (j){
                            dp[i][j][k][h]=(dp[i][j][k][h]+dp[i-1][j-1][k][h])%11380;
                            dp1[i][j][k][h]+=dp[i-1][j-1][k][h];
                        }
                        else if (k){
                            dp[i][j][k][h]=(dp[i][j][k][h]+dp[i-1][j][k-1][h])%11380;
                            dp1[i][j][k][h]+=dp[i-1][j][k-1][h];
                        }
                        else{
                            dp[i][j][k][h]=(dp[i][j][k][h]+dp[i-1][j][k][h-1])%11380;
                            dp1[i][j][k][h]+=dp[i-1][j][k][h-1];
                        }
                        // dp[i][j][k][h]%=11380;
                        // dp1[i][j][k][h]%=11380;
                    }
                }
            }
        }
    }
    printf("%d",dp[d][l1][l2][l3]);
    return 0;
}
最慢点770ms
取模前代码
CPP
#include <bits/stdc++.h>
using namespace std;
long long dp[35][35][35][35],dp1[35][35][35][35];
int l1,l2,l3,d;
int main(){
    cin>>l1>>l2>>l3>>d;
    dp[0][0][0][0]=1;
    dp1[0][0][0][0]=1;
    for (int i=1;i<=d;i++){
        for (int j=0;j<=l1;j++){
            for (int k=0;k<=l2;k++){
                for (int h=0;h<=l3;h++){
                    if (j+k+h==0){
                        continue;
                    }
                    for (int j1=0;j1<=j;j1++){
                        for (int k1=0;k1<=k;k1++){
                            for (int h1=0;h1<=h;h1++){
                                if (j1+k1+h1>0 && j1+k1+h1<j+k+h){
                                    for (int x=1;x<i;x++){
                                        dp[i][j][k][h]+=dp1[x][j1][k1][h1]*dp[i][j-j1][k-k1][h-h1];
                                    }
                                    for (int x=1;x<i;x++){
                                        dp[i][j][k][h]+=dp1[i][j1][k1][h1]*dp[x][j-j1][k-k1][h-h1];
                                    }
                                    dp[i][j][k][h]+=dp1[i][j1][k1][h1]*dp[i][j-j1][k-k1][h-h1];
                                }
                            }
                        }
                    }
                    if (i){
                        if (j){
                            dp[i][j][k][h]+=dp[i-1][j-1][k][h];
                            dp1[i][j][k][h]+=dp[i-1][j-1][k][h];
                        }
                        else if (k){
                            dp[i][j][k][h]+=dp[i-1][j][k-1][h];
                            dp1[i][j][k][h]+=dp[i-1][j][k-1][h];
                        }
                        else{
                            dp[i][j][k][h]+=dp[i-1][j][k][h-1];
                            dp1[i][j][k][h]+=dp[i-1][j][k][h-1];
                        }
                    }
                }
            }
        }
    }
    cout<<dp[d][l1][l2][l3]<<endl;
    return 0;
}
最慢点169ms

回复

8 条回复,欢迎继续交流。

正在加载回复...