比赛 组合计数1 评测结果 WEEEEEEEEW
题目名称 方案数 最终得分 0
用户昵称 Ruyi 运行时间 1.230 s
代码语言 C++ 内存使用 4.08 MiB
提交时间 2026-02-26 11:31:46
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define N 101
#define mod 998244353
using namespace std;
ll n,m,r,o,dp[N][N][N],p2[63],wh;
struct node{ll x,y,z;}a[N];
int main(){
    freopen("problema.in","r",stdin);
    freopen("problema.out","w",stdout);
    cin>>n>>m>>r>>o;
    for(int i=1;i<=o;i++){
        cin>>a[i].x>>a[i].y>>a[i].z;
        dp[a[i].x][a[i].y][a[i].z]=-1;
    }
    p2[0]=1;
    for(int i=1;i<63;i++) p2[i]=p2[i-1]*2;
    dp[0][0][0]=1;
    for(int i=0;i<=n;i++)
    for(int j=0;j<=m;j++)
    for(int k=0;k<=r;k++)
    if(i!=0||j!=0||k!=0){
        while(p2[wh]<=i){
            if((p2[wh]&i)!=0&&dp[i-(p2[wh]&i)][j][k]>0) dp[i][j][k]+=dp[i-(p2[wh]&i)][j][k];
            wh++;
        }
        wh=0;
        while(p2[wh]<=j){
            if((p2[wh]&j)!=0&&dp[i][j-(p2[wh]&j)][k]>0) dp[i][j][k]+=dp[i][j-(p2[wh]&j)][k];
            wh++;
        }
        wh=0;
        while(p2[wh]<=k){
            if((p2[wh]&k)!=0&&dp[i][j][k-(p2[wh]&k)]>0) dp[i][j][k]+=dp[i][j][k-(p2[wh]&k)];
            wh++;
        }
        wh=0;
    }
    cout<<dp[n][m][r]<<endl;
    return 0;
}