51Nod-1684-子集价值

来源:互联网 发布:第十二个天体 知乎 编辑:程序博客网 时间:2024/05/22 12:55

ACM模版

描述

描述

题解

这个 dp 好难理解……

官方题解:

描述

似懂非懂还装懂的样子☺(^__^)

代码

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 5e4 + 10;const int MOD = 1e9 + 7;int n, p;int b[MAXN];int a[2][2];int dp[MAXN][2][2];void get_mod(int &x){    if (x >= MOD)    {        x -= MOD;    }}int get(int x, int y){    memset(dp, 0, sizeof(dp));    for (int k = 1; k <= n; k++)    {        int n1 = (b[k] >> x) & 1, n2 = (b[k] >> y) & 1;        get_mod(++dp[k][n1][n2]);        for (int i = 0; i < 2; i++)        {            for (int j = 0; j < 2; j++)            {                get_mod(dp[k][a[i][n1]][a[j][n2]] += dp[k - 1][i][j]);                get_mod(dp[k][i][j] += dp[k - 1][i][j]);            }        }    }    return dp[n][1][1];}int main(){    scanf("%d%d", &n, &p);    for (int i = 0; i < 2; i++)    {        for (int j = 0; j < 2; j++)        {            scanf("%d", &a[i][j]);        }    }    for (int i = 1; i <= n; i++)    {        scanf("%d", &b[i]);    }    int ans = 0;    for (int i = 0; i < p; i++)    {        for (int j = 0; j < p; j++)        {            ans = (ans + (1ll << (i + j)) % MOD * get(i, j)) % MOD;        }    }    printf("%d\n", ans);    return 0;}
原创粉丝点击