小清新/思维题

小(da)清(du)新(liu)

下课无聊的时候想了一会,然后发现了一点东西。

 

$$n = \prod_{i = 1} ^ m p_i ^ {a_i}$$

$$f(n) = \sum_{i = 1} ^ m a_i$$

给定 $n < 998244353$ ,求 $1$ 到 $n$ 中有多少个数字,满足 $f(i)$ 为偶数。

 

设有 $x$ 个奇数,$y$ 个偶数,显然 $x + y = n$ ,如果再能够构造一个 $x, y$ 的线性组合,并能够方便地计算出其取值,那么就能够解决问题了。

恰好我学习杜教筛的时候知道有这样一个函数:

$$\lambda(n) = (-1) ^ {\sum_{i = 1} ^ m a_I}$$

考虑 $T = \sum_{i = 1} ^ n \lambda(i)$ 的意义,就是 $1$ 到 $n$ 中,偶数个数减去奇数个数,即 $T = y - x$ 。

至于 $T$ 怎么用杜教筛计算,利用性质

$$(\lambda \times I)(n) = [n \text{完全平方数}]$$

即可。

 

这道题看起来很巧妙,但是是否真的是这么巧妙?

这道题引起了我的一个思考:能不能对于某个给定的 $k$ ,求出分别有多少个数满足 $f(i) \bmod k = 0, 1, 2, ..., k - 1$ 。

 

我是从类比入手的。

设出 $x_0, x_1, ..., x_{k - 1}$ ,然后构建它们之间的 $k$ 个线性无关的线性组合,并能够方便地计算出这些线性组合的值。

观察到原本 $k = 2$ ,一个式子是 $1 x + 1 y$ ,一个式子是 $1 x - 1 y$ ,而 $1$ 和 $-1$ 都是 $2$ 次单位负根,于是我就猜想,第 $i$ 个式子为:

$$(w_k ^ 0) ^ i x_0 + (w_k ^ 1) ^ i x_1 + ... + (w_k ^ {k - 1}) ^ i x_{k - 1} = ?$$

可以看作 $x_j$ 中的项贡献 $(w_k ^ j) ^ i$ ,重新写作

$$(w_k ^ 0) ^ i x_0 + (w_k ^ 1) ^ i x_1 + ... + (w_k ^ {k - 1}) ^ i x_{k - 1} = \sum_{j = 1} ^ n \lambda_i(j)$$

$$\lambda_i(n) = (w_k ^ i) ^ {(f(n) \bmod k)} = w_k ^ {i f(n)}$$

发现

$$\lambda_i(p ^ q) = w_k ^ i q$$

$$\lambda_i(p) = w_k ^ i$$

$$\lambda_i(p ^ a q ^ b) = w_k ^ i (a + b) = \lambda_i(p ^ a) \lambda(q ^ b)$$

万事俱备了,$p ^ q$ 知道,$p$ 知道,而且是积性函数,所以直接 min_25 筛。

总结一下,构造了 $k$ 个式子 $(w_k ^ 0) ^ i x_0 + ... + (w_k ^ {k - 1}) ^ i x_{k - 1} = \sum_{j = 1} ^ n \lambda_i (j)$ ,然后可以得到 $\lambda_i(j)$ 的积性,然后 min_25 筛,然后 IDFT 。

 

其实根本没这么麻烦,直接考虑 $k$ 次循环多项式,证明一下积性,直接带着数组去 min_25 筛。一个不从类比入手的人应该很容易想到这一点。

而我做的工作,只是先进行了一次 DFT ,用 min_25 筛求出了 DFT 的值,然后再 IDFT 。

总之还是自己太傻逼了。

 



  • zoj 4015 Liblume
    给出一个\(n \times m\)的字符矩阵,你可以把交换任意两行交换任意次,求面积最大的行和列都回文的子矩阵(行和列都要连续)
    数据范围\(n \times m \le 10^5, \sum_{}^{} n \times m \le 10^6\)
    口胡一下:对每行分别Manarcher算出以某个对称轴的最长回文串;枚举子矩阵的对称轴,只需要保留一边的字符,都是若干个前缀(也可以通过都是后缀算),考虑子矩阵上下对称的行所对应的前缀在这些前缀的排序中一定是相邻的(这样是最优的),那么如果已经选定了一些行要把他们组成子矩阵,一定是连续的两个匹配(如果是奇数那么有一个要和自己匹配),组成的最长长度会被被选的行的回文长度和匹配之间的\(LCP\)所限制,面积就是这个长度乘上选的行的个数。那么我们考虑枚举这个组成的长度,算出在长度不下于它的情况下最多能选几行。假设考虑枚举的长度不断变小,有些行可以被选了,有些排序后相邻的行之间可以匹配了,每次都把长度一点点变小(当然不是每次减一,要维护一下可能改变任意状态的最大的长度),再搞一搞就可以贡献答案了。总的时间复杂度应该是\(O(n m \log n m)\)。常数可能会飞起。

  • AGC031C Differ by 1 Bit
    Codeforces Round #558 (Div. 2) E. Magical Permutation

  • luogu P5241 序列

  • 有一棵树,一个集合\(S \subseteq [0, n)\),每个点有一个点权\(a_i\)

  1. 计算出\(b_i = \sum\limits_{j在i的子树内且dep_j - dep_i \in S} a_j\)
  2. 计算出\(c_i = \sum\limits_{i在j的子树内且dep_i - dep_j \in S} a_j\)
    idea from a problem

思(tao)维(lu)题

CODECHEF May Challenge 2019 Division 2 BINARY

Codeforces Round #190 (Div. 1) D. Ciel and Flipboard

Codeforces Round #395 (Div. 1) C. Timofey and remoduling

posted @ 2019-05-10 17:45  tkandi  阅读(188)  评论(0编辑  收藏  举报