P2396 yyy loves Maths VII

/*
n<=24张卡牌ai 随意选择顺序 若过程中值==厄运数字 失败 否则成功 问成功的方案数
dfs->RE 考虑状压dp
f[i]:i状态下成功的方案数 
    f[i]=sum(f[i^(1<<j-1)]) (i&(1<<j-1)==1) f[0]=1(f[1]=f[0]+0)
    dis[i]=dis[i^(1<<j-1)]+dis[1<<j-1]
    
8bit=1byte
2*1<<26==2*1e6*64==1e8
222MB=222*1024KB=222*1024^2 Byte==222*1e6*8 bit==2e9 bit

int 数组 4byte==32bit ->3e9
ll 数组  8byte==64bit ->6e9

*/
/*

*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;

int n,m;
int dis[1<<26],f[1<<26],b1,b2;

void add(int &a,int b){ for(a+=b;a>=mod;a-=mod); }

void solve(int x){
    for(int i=x,j;i;i^=j){ j=i&-i; add(f[x],f[x^j]) ;}
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>dis[1<<(i-1)];
    cin>>m;
    if(m==1) cin>>b1;
    else if(m==2) cin>>b1>>b2;
    
    f[0]=1;
    for(int i=1;i<(1<<n);i++)
    {
        int j=i&-i;
        dis[i]=dis[i^j]+dis[j];
        if(dis[i]==b1||dis[i]==b2) continue;
        solve(i);
    }
    cout<<f[(1<<n)-1]<<'\n';
    
    return 0;
}

 

posted @ 2023-12-10 12:49  JMXZ  阅读(7)  评论(0)    收藏  举报