[cf1103E]Radix sum
类似于uoj272,即$B=10$的情况,然后有以下几个细节问题:
1.答案对$2^{58}$取模可以先使用自然溢出模$2^{64}$,最后对$2^{58}$取模即可
2.为了避免实数,令$\omega=\cos\frac{2\pi}{10}+\sin\frac{2\pi}{10}i$,初始每一个数必然是$\omega^{i}$,相乘也就是多项式乘法
根据$\omega^{10}=1$,可以将其幂次对10取模,即是一个9次多项式
又因为$\omega^{5}=-1$,因此$\omega^{i+5}=-\omega^{i}$,即可以将5-9次项都降为0-4次项
再根据$\omega^{4}-\omega^{3}+\omega^{2}-\omega^{1}+1=\frac{1+\omega^{5}}{1+\omega}=0$,可以将4次项降为0-3次项
接下来,考虑若最后1-3次项存在非0,由于最终结果是实数,因此这些次项的虚部带权和为0
其实部带权和一定可以用$\omega^{0}$来表示,也就是可以继续降幂,但事实上我们无法再找到可以降$\omega^{3}$的式子,因此最终必然只有$\omega^{0}$系数非0,即答案(严格地证明并不会证)
3.关于10在模$2^{64}$下不一定没有逆元,可以将10放在最外面除以$10^{5}$,之后由于2一定是可以直接除掉的(因为最终结果是整数),再求出5的逆元$inv$,乘上$inv^{5}$即可
时间复杂度为$o(4^{2}Bn+n\log_{2}n)$(这里$n=10^{5}$,不与数字数量区分)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define M 5
5 #define B 10
6 #define ll long long
7 int n,m,x,base[N][M];
8 struct Complex{
9 unsigned ll a[4];
10 Complex(){
11 memset(a,0,sizeof(a));
12 }
13 Complex(int x){
14 memset(a,0,sizeof(a));
15 a[0]=x;
16 }
17 Complex(int x,int y){
18 memset(a,0,sizeof(a));
19 a[0]=x,a[1]=y;
20 }
21 Complex operator + (const Complex &k)const{
22 Complex o;
23 for(int i=0;i<4;i++)o.a[i]=a[i]+k.a[i];
24 return o;
25 }
26 Complex operator * (const Complex &k)const{
27 Complex o;
28 for(int i=0;i<4;i++)
29 for(int j=0;j<4;j++){
30 if (i+j<4)o.a[i+j]=o.a[i+j]+a[i]*k.a[j];
31 if (i+j==4){
32 unsigned ll s=a[i]*k.a[j];
33 o.a[0]-=s,o.a[1]+=s,o.a[2]-=s,o.a[3]+=s;
34 }
35 if (i+j>4)o.a[i+j-5]=o.a[i+j-5]-a[i]*k.a[j];
36 }
37 return o;
38 }
39 }inv,A[B][B],invA[B][B],a[N];
40 Complex pow(Complex n,ll m){
41 Complex s=n,ans=Complex(1);
42 while (m){
43 if (m&1)ans=ans*s;
44 s=s*s;
45 m>>=1;
46 }
47 return ans;
48 }
49 void DFT(Complex *a){
50 Complex aa[B];
51 for(int i=0,s=1;i<M;i++,s*=B)
52 for(int j=0;j<n;j++)
53 if (!base[j][i]){
54 for(int k=0;k<B;k++)aa[k]=Complex();
55 for(int k=0;k<B;k++)
56 for(int l=0;l<B;l++)aa[k]=aa[k]+a[j+l*s]*A[l][k];
57 for(int k=0;k<B;k++)a[j+k*s]=aa[k];
58 }
59 }
60 void IDFT(Complex *a){
61 Complex aa[B];
62 for(int i=0,s=1;i<M;i++,s*=B)
63 for(int j=0;j<n;j++)
64 if (!base[j][i]){
65 for(int k=0;k<B;k++)aa[k]=Complex();
66 for(int k=0;k<B;k++)
67 for(int l=0;l<B;l++)aa[k]=aa[k]+a[j+l*s]*invA[l][k];
68 for(int k=0;k<B;k++)a[j+k*s]=aa[k];
69 }
70 }
71 int main(){
72 n=1e5;
73 inv=pow(Complex(5),(1LL<<57)-1);
74 for(int i=0;i<n;i++){
75 base[i][0]=i%B;
76 for(int j=1;j<M;j++)base[i][j]=base[i/B][j-1];
77 }
78 for(int i=0;i<B;i++)
79 for(int j=0;j<B;j++){
80 A[i][j]=pow(Complex(0,1),i*j);
81 invA[i][j]=pow(Complex(0,1),B*B-i*j)*inv;
82 }
83 scanf("%d",&m);
84 for(int i=1;i<=m;i++){
85 scanf("%d",&x);
86 a[x]=a[x]+Complex(1);
87 }
88 DFT(a);
89 for(int i=0;i<n;i++)a[i]=pow(a[i],m);
90 IDFT(a);
91 for(int i=0;i<m;i++){
92 a[i].a[0]>>=M;
93 a[i].a[0]&=((1LL<<58)-1);
94 printf("%llu\n",a[i].a[0]);
95 }
96 }
[cf1103E]Radix sum的更多相关文章
- 题解 CF1103E Radix sum
题目传送门 题目大意 给出一个\(n\)个数的序列\(a_{1,2,..,n}\),可以选\(n\)次,每次可以选与上次选的相同的数,问对于\(\forall p\in[0,n-1]\)满足选出来的数 ...
- Codeforces 1103 E. Radix sum
题目链接 神题. 题意:给定一个长度为\(10^5\)的幂级数\(a\),将卷积的下标运算定义为十进制下的不进位加法,求\(a^k\)模\(2^{58}\)的结果.\(k\leq 10^9\). 题解 ...
- CodeForces 1103E. Radix sum
题目简述:对任意两个(正)十进制数$a = \overline{a_{k-1}\dots a_1a_0}$和$b = \overline{b_{k-1}\dots b_1b_0}$,定义其[十进制按位 ...
- $\text {FWT}$学习笔记
\(\text {FWT}\) 学习笔记 正常项的\(\text {FWT}\) 在\(\text {OI}\)中,我们经常会碰到这种问题: 给出一个长度为\(n\)的序列\(a_{1,2,...,n ...
- 1010 Radix
1010 Radix 注意点 如111 1 1 10类似情况下,若n为个位数,如果本身比另一个数小,则多少的进制都是没有用的(可能会造成空循环而超时),不过好像没有这么一个测试用例 进制应该比最少数据 ...
- 模拟实现C库的atoi、atof和itoa
1.C函数atoi atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数.广泛的应用在计算机程序和办公软件中.atoi( ) 函数会扫描参数 nptr字符 ...
- 模拟实现库函数的atoi、atof和itoa
1.函数atoi atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数.广泛的应用在计算机程序和办公软件中.atoi( ) 函数会扫描参数 nptr字符串 ...
- 字符串函数---itoa()函数具体解释及实现
itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据. string:目标字符串的地址. ...
- PAT 解题报告 1010. Radix (25)
1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 11 ...
随机推荐
- xLua中Lua调用C#
xLua中Lua调用C# 1.前提 这里使用的是XLua框架,需要提前配置xlua,设置加载器路径: 可以参考之前的Blog:<xlua入门基础>: //调用段,所有的lua代码都写在Lu ...
- 从零入门 Serverless | Serverless Kubernetes 应用部署及扩缩容
作者 | 邓青琳(轻零) 阿里云技术专家 导读:本文分为三个部分,首先给大家演示 Serverless Kubernetes 集群的创建和业务应用的部署,其次介绍 Serverless Kuberne ...
- 干货 | 数据为王,携程国际火车票的 ShardingSphere 之路
以下文章来源于携程技术 ,作者瑞华 作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐 ...
- 手摸手教你用 yapi-to-typescript生成Yapi的TypeScript数据类型
一 背景 现代社会比较重视效率,本着这个思想宗旨,能用工具自动高效做的事情,就不要低质量的勤奋.yapi-to-typescript就是一款自动生成接口请求与响应的typescript数据类型定义的工 ...
- 更好的 java 重试框架 sisyphus 背后的故事
sisyphus 综合了 spring-retry 和 gauva-retrying 的优势,使用起来也非常灵活. 今天,让我们一起看一下西西弗斯背后的故事. 情景导入 简单的需求 产品经理:实现一个 ...
- 线路由器频段带宽是是20M好还是40M好
无线路由器频段带宽还是40M好. 40M的信号强,速度快. 1.20MHz在11n的情况下能达到144Mbps带宽.穿透性不错.传输距离较远 40MHz在11n的情况下能达到300Mbps带宽.穿 ...
- STM32必学的时钟系统
STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图: 上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一 ...
- matplotlib散点图
我们常用的统计图如下: 1.学会绘制散点图 一个小demo: 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规 ...
- 『学了就忘』Linux基础 — 5、使用VMware创建虚拟机
目录 1.在VMware中创建虚拟机 (1)点击[创建新的虚拟机]. (2)选择系统安装方式 (3)选择客户机操作系统 (4)自定义虚拟机的名称和安装位置. (5)指定系统硬盘容量 (6)完成创建 2 ...
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...