CodeForces 1103E. Radix sum
题目简述:对任意两个(正)十进制数$a = \overline{a_{k-1}\dots a_1a_0}$和$b = \overline{b_{k-1}\dots b_1b_0}$,定义其【十进制按位加法(Decimal digit-wise addition)】$c = a \oplus b = \overline{c_{k-1}\dots c_1c_0}$,其中$c_i = (a_i+b_i) \bmod 10$。给定$1 \leq n \leq 10^5$个正整数$0 \leq x_i < 10^5$,对每个$0 \leq k < n$,求有多少个下标序列$1 \leq i_1, i_2, \dots, i_n \leq n$,使得
$$\bigoplus_{j=1}^n x_{i_j} = k. $$
答案$\bmod 2^{58}$。
解:
建模:
设$a_k$表示$k$在$x_1, x_2, \dots, x_n$中出现的次数,定义母函数(Generating function)
$$ a(x) = a_0x^0 + a_1x^1 + a_2x^2 + \dots + a_{N-1}x^{N-1}, $$
其中$N = 10^5$。
定义【按位卷积(Digit-wise convolution)】
$$ (a \odot b) (x) = a(x) \odot b(x) = \sum_{i=0}^{N-1} \sum_{j=0}^{N-1} a_i b_j x^{i \oplus j}. $$
若记$a^{\odot m} = a^{\odot (m-1)} \odot a$且$a^{\odot 1} = a$,则对每个$0 \leq k < n$,$a^{\odot n}(x)$中$x^k$的系数即为所求。
记进制$B = 10$。实际上,$a \odot b$是一个$d = \log_B N = 5$维卷积。
多维广义离散傅里叶变换(Multidimensional general discrete Fourier transform):
设$R$是环(Ring),正整数$n \geq 1$,称$\omega$是$R$的主$n$次单位根(Principal $n$-th root of unity),若
$$ \begin{aligned} & \omega^n = 1, \\ & \sum_{j=0}^{n-1} \omega^{jk} = 0 \text{ for } 1 \leq k < n. \end{aligned} $$
特别地,若$R$是整环(Integral domain),则第二个条件可以简化为$\omega^{k} \neq 1$对$1 \leq k < n$。
记模$n$剩余类环为$\mathbb{Z}_{n} = \mathbb{Z}/n\mathbb{Z}$。令$a: \mathbb{Z}_{n} \to R$,或记作多项式
$$ a(x) = a_0x^0 + a_1x^1 + \dots + a_{n-1}x^{n-1}. $$
定义傅里叶变换将$a$变换成$b = \mathcal{F}(a)$为
$$ b_k = \sum_{j=0}^{n-1} \omega^{jk} a_j. $$
若$n = \underbrace{1+1+\dots+1}_{n} \in R$且$n^{-1}$在$R$中存在,则傅里叶变换的逆变换$a = \mathcal{F}^{-1}(b)$为
$$ a_j = n^{-1} \sum_{k=0}^{n-1} \omega^{-jk} b_k. $$
当$n^{-1}$不存在时,可退而求其次有$na = \mathcal{F}^*(b)$为
$$ na_j = \sum_{k=0}^{n-1} \omega^{-jk} b_k. $$
设$R_1, R_2, \dots, R_d$均是环,$\omega_1, \omega_2, \dots, \omega_d$依次是$R_1, R_2, \dots, R_d$的主$n_1, n_2, \dots, n_d$次单位根。
令$a: \mathbb{Z}_{n_1} \times \mathbb{Z}_{n_2} \times \dots \times \mathbb{Z}_{n_d} \to R$,或者记作多项式
$$ a(x_1, x_2, \dots, x_n) = \sum_{i_1=0}^{n_1-1} \dots \sum_{i_d=0}^{n_d-1} a_{i_1, i_2, \dots, i_d} x_1^{i_1} \dots x_d^{i_d}. $$
定义傅里叶变换将$a$变换成$b = \mathcal{F}(a)$为
$$ b_{k_1, k_2, \dots, k_d} = \sum_{j_1 = 0}^{n_1-1} \dots \sum_{j_d = 0}^{n_d-1} \omega_1^{j_1k_1} \dots \omega_d^{j_dk_d} a_{j_1,j_2,\dots,j_d}. $$
其逆变换为
$$ a_{j_1,j_2,\dots,j_d} = n_1^{-1} n_2^{-1} \dots n_d^{-1} \sum_{k_1 = 0}^{n_1-1} \dots \sum_{k_d = 0}^{n_d-1} \omega_1^{-j_1k_1} \dots \omega_d^{-j_dk_d} b_{k_1, k_2, \dots, k_d}. $$
性质:
$$ \mathcal{F}(a) \cdot \mathcal{F}(b) = \mathcal{F}(a \odot b), $$
其中$(x \cdot y)(k) = x(k) \cdot y(k)$。进而
$$ \mathcal{F}^{-1}((\mathcal{F}(a))^m) = a^{\odot m}, $$
其中$x^m = x^{m-1} \cdot x$且$x^1 = x$。
在本题中,$n_1 = n_2 = \dots = n_d = B$。
环$R$的选取:
一般取复数域$R = \mathbb{C}$,则$\omega = \exp \left( \frac {2i \pi} n \right)$。但此题要求模$2^{58}$,浮点数精度不足以支撑(一般只能支持$a_j \sim 10^5$的情况)。为此,我们需要另外的环。我们引入分圆多项式(Cyclotomic polynomial),$n$阶分圆多项式定义为
$$ \Phi_n(x) = \prod_{1 \leq k \leq n, \gcd(k, n) = 1} \left( x - \exp\left(\frac{2i \pi k}{n}\right) \right). $$
特别地,
$$ \Phi_{10}(x) = x^4-x^3+x^2-x+1. $$
定理:
$$ \mathbb{Z}[x]/(\Phi_n(x)) \simeq \mathbb{Z}[\omega_n], $$
其中$\omega_n = \exp \left( \frac {2i\pi} {n} \right)$。注意到,$x$是$\mathbb{Z}[x]/(\Phi_n(x))$的主$n$次单位根。
为将答案模$2^{58}$,我们取$R = \mathbb{Z}_{2^{64}}[x]/\Phi_{10}(x)$,但此环中$N = 10^5$的逆,即$N^{-1}$,不存在,故只能有
$$ \mathcal{F}^*\left(\left(\mathcal{F}(a)\right)^{m}\right) \equiv N a^{\odot m} \pmod {2^{64}}. $$
于是,最后剩下一个数论问题:已知$y = 10^5 x \bmod 2^{64}$,其中$x \in \mathbb{Z}$,求$x \bmod 2^{58}$。
注意到必有$2^5 | y$,令$z = \frac y {2^5}$,则$z \equiv 5^5 x \pmod {2^{58}}$。
又$\gcd(5^5, 2^{58}) = 1$,故$(5^5)^{-1} \equiv (5^5)^{\phi(2^{58})-1} \pmod {2^{58}}$,其中$\phi(\cdot)$是欧拉函数(Euler's totient function)。
进而,$x \equiv (5^5)^{-1} z \pmod {2^{58}}$。
时间复杂度:
$O(D^2 B N \log_B N+D^2 N \log n)$,其中$D = \operatorname{deg} \Phi_B(x) = 4$。
解2:
可取$\mathbb{Z}[x]/(\Phi_5(x))$,其中$\Phi_5(x) = x^4+x^3+x^2+x+1$,且$-x$是主$10$次单位根。
在计算$\omega^{jk} a_j$时,朴素多项式乘法需要$O(D^2)$复杂度。为了降低复杂度,我们取$R = \mathbb{Z}[x]/(x^5-1)$,而$\mathbb{Z}[x]/(\Phi_5(x))$作为其子环。
这时,在$\mathbb{Z}[x]/(x^5-1)$中计算$\omega^{jk} a_j$,可在$O(D)$的复杂度内完成。
从而总时间复杂度为$O(D B N \log_B N + D^2 N \log n)$,其中$D = \operatorname{deg} (x^5-1) = 5$。
CodeForces 1103E. Radix sum的更多相关文章
- Codeforces 396B On Sum of Fractions 数论
题目链接:Codeforces 396B On Sum of Fractions 题解来自:http://blog.csdn.net/keshuai19940722/article/details/2 ...
- codeforces 963A Alternating Sum
codeforces 963A Alternating Sum 题解 计算前 \(k\) 项的和,每 \(k\) 项的和是一个长度为 \((n+1)/k\) ,公比为 \((a^{-1}b)^k\) ...
- codeforces 1217E E. Sum Queries? (线段树
codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...
- Codeforces 1103 E. Radix sum
题目链接 神题. 题意:给定一个长度为\(10^5\)的幂级数\(a\),将卷积的下标运算定义为十进制下的不进位加法,求\(a^k\)模\(2^{58}\)的结果.\(k\leq 10^9\). 题解 ...
- Codeforces 577B Modulo Sum
http://codeforces.com/problemset/problem/577/B 题意:有n个数,求有无一个子序列满足和是m的倍数 思路:用模下的背包做,发现n是十的六次方级别,但是有个神 ...
- Codeforces 85 D. Sum of Medians
题目链接:http://codeforces.com/contest/85/problem/D 做法果然男默女泪啊..... 大概就是直接开了一个$vector$每次插入删除都用自带的$insert$ ...
- Codeforces 797B - Odd sum
B. Odd sum 题目链接:http://codeforces.com/problemset/problem/797/B time limit per test 1 second memory l ...
- Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)
题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...
- Educational Codeforces Round 37-F.SUM and REPLACE题解
一.题目 二.题目链接 http://codeforces.com/contest/920/problem/F 三.题意 给定$N$个范围在$[1, 1e6)$的数字和$M$个操作.操作有两种类型: ...
随机推荐
- MySQL中文显示乱码
http://blog.csdn.net/acmain_chm/article/details/4174186
- 7.JAVA编程思想笔记隐藏实施过程
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
- Cocos2d-X中的粒子
Cocos2d-x引擎提供了强大的type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/particle-s ...
- iOS开发:Toast for iPhone
iOS开发:Toast for iPhone 分享一个我写的类似于android的toast的提示框 主要特点: 1,支持屏幕Y轴任意位置显示,设置距离顶/底端距离 2,支持多行文本 3,支持设置 ...
- Oracle中Hint深入理解
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...
- linux中vi编辑器(转载)
三种模式相互切换 在命令终端输入vi进入vi编辑器. 命令模式:进入编辑器即进入命令模式, 输入模式:在命令模式下输入“i ”进入输入模式: 末行模式:按“:”进入末行模式: 在输入模式切换至末行模式 ...
- 实例具体解释:反编译Android APK,改动字节码后再回编译成APK
本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...
- EasyDarwin开源流媒体服务器低延时直播之转发缓存跟进算法
前言 前一段时间,我们为EasyDarwin实现了客户端快速显示画面/听到同步声音的缓存关键帧检索方案,具体的实现方法分别在<EasyDarwin手机直播是如何实现的快速显示视频的方法>和 ...
- Möbius strip
en.wikipedia.org/wiki/Möbius_strip http://mechproto.olin.edu/final_projects/average_jo.html Fabricat ...
- shapes
接口 shape package shape; public abstract interface shape { public abstract void Draw(); public abstra ...