2019多校第一场DParity of Tuples

题意

给定n行m列数,对于 [0,2^k-1] 内的数x求

分析

1. 求 Count(x)
来自Qls,代表 1的个数的奇偶性,如果连乘式中有一个为偶, 整个就为0
图片说明
2. 把连乘展开
得到
我们知道

3. FWT_XOR 正好就是我们需要的

(C1表示i&j中1的个数奇偶性为0,C2表示i&j的1的个数的奇偶性为1)
图片说明

参考代码

const LL     mod = 1e9 + 7;
LL qpow(LL a, LL b) {LL s = 1; while (b > 0) {if (b & 1)s = s * a % mod; a = a * a % mod; b >>= 1;} return s;}
LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
int dr[2][4] = {1, -1, 0, 0, 0, 0, -1, 1};
typedef pair P;
// 异或
void FWT(int  *a, int N, int opt) {
    const int inv2 = qpow(2, mod - 2);
    // j是区间开始点,i是区间距离,k是具***置,j+k,i+j+k就是在a数组中的坐标
    for (int i = 1; i < N; i <<= 1) {
        for (int p = i << 1, j = 0; j < N; j += p) {
            for (int k = 0; k < i; ++k) {
                LL X = a[j + k], Y = a[i + j + k];
                a[j + k] = (X + Y) % mod;
                a[i + j + k] = (X + mod - Y) % mod;
                if (opt == -1) a[j + k] = 1ll * a[j + k] * inv2 % mod, a[i + j + k] = 1ll * a[i + j + k] * inv2 % mod;
            }
        }
    }
}

const int maxn = 1 << 21;
int a[maxn];
int  v[maxn];
void dfs(int *a, int x, int  m, int sign, int t) {
    if (x > m) {
        v[t] += sign;
        return ;
    }
    dfs(a, x + 1, m, sign, t);
    dfs(a, x + 1, m, -sign, t ^ a[x]);
}
int main(void)
{
    int n, m, k;
    while (cin >> n >> m >> k) {
        for (int i = 0; i < (1 << k); ++i)
            v[i] = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                scanf("%d", &a[j]);
            }
            dfs(a, 1, m, 1, 0);
        }
        int N = 1 << k;
        FWT(v, N, 1);
        LL sum = 0;
        LL inv = qpow(1<<m, mod - 2);
        LL tmp = 1;
        for (int i = 0; i < N; ++i) {
            sum ^= v[i] * tmp % mod * inv % mod;
            tmp = tmp*3%mod;
        }
        cout << sum << endl;
    }

    return 0;
}
全部评论
小白求具体说一下为啥用的是FWT_XOR啊QAQ
点赞 回复 分享
发布于 2019-07-22 22:24

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务