[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 ...
随机推荐
- 阿里云 Serverless 再升级,从体验上拉开差距
差距都在细节上. Serverless 要成就云计算的下一个 10 年,不仅需要在技术上持续精进,也需要在产品体验上精耕细作. 近日,阿里云 Serverless 再度升级,发布了一系列围绕产品体验方 ...
- Lamport时间戳论文笔记
本文主要参考文献[1]完成. 声明:本人仅在博客园发表了本文章,笔名LightningStar,其他网站均为转载. 笔记 私以为,论文中作者的核心工作是为分布式系统建立了一种数学模型,并基于这种数学模 ...
- 题解 Sue的小球/名次排序问题/方块消除/奥运物流
Sue的小球 名次排序问题 方块消除 奥运物流 Sue的小球 题目大意 有 \(n\) 个小球在下落,初始位置 \((x_i,y_i)\),下落速度为 \(v_i\).你初始位置在 \(x_0\),速 ...
- Spring框架访问数据库的两种方式的小案例
1.1 以Xml的方式访问数据库的案例 要以xml的方式访问数据库需要用到JdbcTemplate ,因为 JdbcTemplate(jdbc的模板对象)在Spring 中提供了一个可以操作数据库的对 ...
- 【Python】 第三周:基本数据类型
整数 python整数无限制 二进制:以0b或者0B开头,例如: 0b010,-0B101 八进制:以0o或者0O开头,例如:0o123,-0O456 浮点数 浮点数间运算存在不确定尾数,不是bug ...
- 利用 CSS Overview 面板重构优化你的网站
本文将向大家介绍 Chrome 87 开始支持的 CSS Overview Panel,并且介绍如何更好地利用这个面板.通过 CSS Overview Panel,可能可以帮助我们: 更准确(高保真) ...
- Endian
Endian 寻址 多字节对象被存储为连续的字节序列,对象的地址为所使用字节中最小的地址. 例如,假设一个类型为 int 的变量 a 的地址为 0x100,也就是说,地址表达式 &a 的值为 ...
- 初学python-day9 函数1(已更新)
函数 一.函数基础 1.什么是函数 在一个完整的项目中,某些功能会被重复使用,那么会将代码段封装成函数,当我们要使用的时候,直接调用即可. 函数是可以实现一定的小程序或者功能. 优点: 增加了代码的重 ...
- 【UE4 C++】调用外部链接库 lib静态库
简述 本例以插件形式测试 使用Lib引用,打包程序运行不用再拷贝lib文件 需要 lib 文件和 .h 头文件 lib部分的代码 .h 头文件 #pragma once #ifndef __MYTES ...
- kafka-eagle监控界面搭建
kafka-eagle监控界面搭建 一.背景 二 .mac上安装kafka-eagle 1.安装JDK 2.安装eagle 1.下载eagle 2.解压并配置环境变量 3.启用kafka的JMX 4. ...