注意到可以用矩阵快速幂求解。
[X11]×[ac01]n
神秘题目,感觉比较简单。
注意到答案可以写作:
[11]×[ab01]m−1×([cd01]×[ab01]m−1)n−1
考虑使用十进制快速幂求解,那么我们每一位的考虑,对于乘 [0,9] 的幂次用普通快速幂。
于是做完了,时间复杂度为 O(∣n∣+∣m∣)。
先读题,需要注意是第一次乱拿而后面按照 nim 游戏进行博弈。
首先,有定没有必败情况,我们可以先拿 n−1 堆,然后让对面什么都干不了,最后把最后一堆全部拿了直接获胜。
考虑怎么求出最小值,因为 nim 的必败情况是所有的数 ⊕ 起来是 0,于是我们就需要从里面找出一个 ∑ 最大的集合满足其所有的子集 ⊕ 起来都不是 0。
于是想到线性基,我们排序之后向线性基内加入,时间复杂度为 O(nlogV)。
对于平方数,容易理解其所有的因子出现的次数都是偶数,于是我们可以开一个数组用二进制记录每个数因子的情况。
把他们塞到一个线性基里面,那么剩下的元素都是可以用线性基里面元素随意组合得到的,于是最终方案事就为 2m−∣S∣−1 种。
首先我们把 S 中的数丢到一个线性基里面,那么有结论 x 就是线性基的大小。
首先有性质,所有的魔法序列中的元素都是线性基中的元素可以表示出来的。
我们不妨设第一个元素为 0,那么第二个元素就一定是线性基中的元素,因为 2,3 个元素之间的之一定是 S 中的元素,所以也一定是线性基中的若干元素,于是第 3 个元素也一定是线性基内可以表示出来的。
所以 x 的上限就是线性基的大小,接下来我们可以通过构造的方式得到一个长度为 2x 的序列。
考虑我们先构造一个长度为 2x 的 1∼2x 的格雷码(就是相邻两个数 ⊕ 起来的 popcount=1),那么我们不妨设 p 是 ai⊕ai+1 为 1 的那一位。
于是我们把线性基中最高位是 p 的那个元素,把它作为 ansi⊕ansi+1 的值。
考虑怎么构造一个格雷码,我们先把少一位的格雷码复制一遍然后反转一次最后接到后面,在原本的位置左侧加上一个 0,复制的在左侧上加一个 1,于是我们就得到了一个新的格雷码。
做完了,时间复杂度为 O(nlogn)。
一个很牛的想法,先考虑如果知道 [l,r] 的线性基怎么做。
我们直接写线性基,需要注意因为二进制天然可以贪心,所以我们从最高位开始考虑。
那么我们只需要判断 ⊕ 上这一位是否更优就行了,时间复杂度为 O(logV)。
考虑一个类似于扫描线的思虑,我们给所有的右端点都开一个线性基,从最高位开始向地位位置尽量靠近 r 的线性基。
询问的时候我们在判断 ⊕ 上是否优秀时同时判断是否在 [l,r] 中就行了,时间复杂度为 O(qlogV)。
https://www.明天动手.top/post/qia-te-lan-shu-he-si-te-lin-shu
我们令:
F(n,m)=i=0∑m(in)
那么,就有:
F(n+1,m)=i=0∑m(in)+(i−1n)=F(n,m)+F(n,m−1)
于是就有:
F(n,m)=2×F(n−1,m)−(mn−1)
我们对行进行分块,把 N 行压成一块,那么我们直接取靠近的 n 的块头然后 n 递推即可。
对于最后无法处理的,直接暴力计算即可,时间复杂度为 O(qn),略慢于莫队做法。
一种不正确的推法:
首先需要学习范德蒙恒等式,式子为:
j=0∑m(ji)(m−jn−i)=(mn)
对于这个式子,我们可以理解为 (ji) 置对 (mn) 造成的贡献为 (m−jn−i)。
那么我们考虑题目的求解:
p=0∑m(pn)=p=0∑mj=0∑p(ji)(p−jn−i)
我们交换求和顺序,得到:
j=0∑m(ji)p=j∑m(p−jn−i)
注意到后面的 ∑ 获取的式子其实对 j,m 的具体值不感兴趣,实际上重要的就只有 m−j,于是得到:
j=0∑m(ji)p=0∑m−j(pn−i)
那么我们把所有的 m(一共 nn)个位置进行分块,拿出 n 个块头,处理其向下走 n 步的结果。
因为我们要处理 nn 个位置,所以需要 O(1) 处理 n←n+1 的变化情况,那么就需要:
F(n,m)=2×F(n−1,m)−(mn−1)
于是我们就把一个简单题做困难了。
一个比较简单的题目,自己思考复杂了。
考虑第 i 位对答案的贡献,容易理解其一定是一个形式如下的式子:
ai×j=0∑n−ict×10j
考虑把后面的 ct 带着式子算出来。
如果 i+j<n,那么我们就已经把原数分成了 2 段了,现在还需要插最多 k−2 个板,那么方案数为:
p=0∑k−2(pn−j−2)
如果 i+j=n,那么其实就之分成了一段,则方案数为:
p=0∑k−1(pn−j−1)
我们令:
F(n,m)=i=0∑m(in)
则:
j=0∑n−ict×10j=F(i−1,k−1)×10n−i+j=0∑n−i−1F(n−j−2,k−2)×10j
那么我们令:
G(m)=j=0∑mF(n−j−2,k−2)×10j
则我们可以通过上一个题目提前预处理出 F(x,k−2),然后再算出 G(x),后直接计算即可。
Ans=i=1∑nai×(F(i−1,k−1)×10n−i+G(n−i−1))
假设:
x=⌈2m⌉,y=⌊2m⌋
那么有柿子:
i=0∑nik×(in)×xiyn−i
注意到本题 O(k2) 可做,考虑写成斯特林数的形式,然后不展开通项公式。
in=j=0∑n(i−j)!n!×{nj}
得到:
i=0∑nj=0∑k(i−j)!i!×{kj}×i!×(n−i)!n!×xiyn−i
简化一下:
j=0∑k{kj}i=0∑n(n−i)!×(i−j)!n!×xiyn−i
进行一些不好想的变化:
j=0∑k{kj}×i=0∑n(n−j)!×(n−i)!×(i−j)!n!×(n−j)!×xiyn−i
然后:
j=0∑k{kj}×(n−j)!n!×i=0∑n(n−i)!×(i−j)!(n−j)!×xiyn−i
最后套路的把后面的阶乘写成组合数:
j=0∑k{kj}×(n−j)!n!×i=0∑n(n−in−j)×xiyn−i
又是套路的,令 p=n−i,则:
j=0∑k{kj}×(n−j)!n!×p=0∑n−j(pn−j)×xn−pyp
注意到后面是一个类似于二项式定理的东西,那么我们调整一下系数:
j=0∑k{kj}×(n−j)!n!×xj×p=0∑n−j(pn−j)×xn−p−jyp
于是得到:
j=0∑k{kj}×(n−j)!n!×xj×mn−j
我们递推处理 {nm},时间复杂度为 O(k2+qk)。
不是很有养分的套路题。
首先需要知道卢卡斯定理,即:
(mn)≡(⌊pm⌋⌊pn⌋)×(mmodpnmodp)(modp)
我们可以理解为在 p 进制下整体左移一位乘以其末尾。
于是就有推论,在 p=2 时只有 m⊆n 的时候为 1。
于是考虑怎么做,我们把第 i 次操作之后第 j 个位置的值记作 si,j,那么显然:
si,j=si,j−1⊕si−1,j
那么我们注意到 si,j 会直接对 si+1,j 和 si,j+1 造成贡献,那么 (i,j) 对 (n,m) 造成的贡献就是通过向右和向下走到 (n,m) 的方案数。
那么我们就得到 s0,i 对第 k 次的贡献为 (n−in+k−i),但是这个东西太丑了,考虑把 a 反转,下表从 0 开始用。
现在得到的贡献为 (ki+k),于是根据卢卡斯定理就有 (i+k)&k=k 时有贡献,换而言之就是 i∩k=∅。
那么我们只需要获得 k 补集的所有子集的异或和就行了,于是我们记 si 表示所有所有的 j∩i=j 的 aj 的异或和。
于是有转移:
si=ai⊕⎝⎛j⊆i∧popcnt(i⊕j)=1⨁sj⎠⎞
于是做完了,时间复杂度为 O(nlogn)。
太帅的一个题目,注意到就是上一个题目的逆运算。
因为上一个题目需要用到补集的子集,所以不能直接快速的计算。
那么我们把行数从 0 开始用,列数从 1 开始用,借助反对角线为中间变量,就有:
(0,n−k)→(ik)(i,n−i),(i,n−i)→(ij)(j,n)
因为异或的子集和超集的逆运算都是其本身,所以我们输入 a[0,n−1] 进行两次操作之后得到的就是 an∼a1。