zoukankan      html  css  js  c++  java
  • 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D

    看此博客之前请先参阅吕凯飞的论文《集合幂级数的性质与应用及其快速算法》,论文中很多符号会被本文延用!

    题目大意

      给定一个 n * m 的二维矩阵和 k,定义$count(x) = sumlimits_{i = 1}^{n} prodlimits_{j = 1}^{m} [v_{i, j} & x 所表示的二进制位有奇数个一] $,求如下式子:

    $$egin{align*}
    igopluslimits_{x = 0}^{2^k - 1} (count(x) * 3^x mod (10^9 + 7))
    end{align*}$$

    分析

      首先对于每一个数 x,给它的 k 位二进制位标号,从 1 ~ k,那么每一个数就可以唯一用一个集合 X 来表示,比如 k = 5, x = 10110,那么 X = {2, 3, 5}。
      定义 U 为全集,包含全部 1 ~ k。(为了方便,后面对应字母的大写就代表这个数对应的集合)
      于是我们可以重新定义 count(x) :$count(x) = count(X) = sumlimits_{i = 1}^{n} prodlimits_{j = 1}^{m} [V_{i, j} cap X 有奇数个元素] $。
      进而:$count(X) = frac{1}{2^m}sumlimits_{i = 1}^{n} prodlimits_{j = 1}^{m} (1 - (-1)^{|V_{i, j} cap X|}) $,其中:$prodlimits_{j = 1}^{m} (1 - (-1)^{|V_{i, j} cap X|}) = 1 + sumlimits_{j = 1}^{m} (-1)^{|X cap V_{i, j}| + 1} + sumlimits_{j_1 = 1}^{m} sumlimits_{j_2 = 1}^{m} [j_1 eq j_2] (-1)^{|X cap V_{i, j_1} cap V_{i, j_2}| + 2} + dots + (-1)^{|X cap (igcaplimits_{j = 1}^m V_{i, j})| + m}$
       又:$(-1)^{|Y|} * (-1)^{|X cap T|} = (-1)^{|(X cap T) oplus Y|} = (-1)^{|(X oplus Y) cap (T oplus Y)|}$
     
       ????????????????????(求大佬指点QAQ)
     
      所以$count(X) = frac{1}{2^m}sumlimits_{T subseteq 2^U} f_T * (-1)^{T cap X} = frac{1}{2^m} * hat{f_X}$
      于是我们只要先算出$f$,然后通过 FWT 算出所有 count(X) 就好了。
      时间复杂度为$O(n2^m + k2^k)$

    代码如下

  • 相关阅读:
    I Hate It
    hdu 2112 HDU Today ( Dijkstra )
    hdu 1280 前m大的数
    hdu 4252 A Famous City
    hdu 2647 Reward
    hdu 2845 Beans
    hdu 3548 Enumerate the Triangles ( 优 化 )
    hdu 3552 I can do it! (贪心)
    HDU 3033 I love sneakers!(分组背包变形)
    hdu 1712 ACboy needs your help 分组背包
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11222654.html
Copyright © 2011-2022 走看看