jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】
正题
题目链接:https://gmoj.net/senior/#main/show/6065
题目大意
oneness(x)oneness(x)oneness(x)表示xxx的约数中全是111的数的个数,给出一个长度为lll的随机生成的数nnn,求∑i=1noneness(i)\sum_{i=1}^noneness(i)i=1∑noneness(i)
解题思路
转换一下题意就是求∑i=2l⌊n10i−19⌋=∑i=2l⌊9n10i−1⌋\sum_{i=2}^l\lfloor\frac{n}{\frac{10^i-1}{9}}\rfloor=\sum_{i=2}^l\lfloor\frac{9n}{10^i-1}\rfloori=2∑l⌊910i−1n⌋=i=2∑l⌊10i−19n⌋
先让nnn乘上999,然后把每一位的贡献拆成小数和整数部分,我们先来看整数部分
首先对于一个k∗10i10j−1\frac{k*10^i}{10^j-1}10j−1k∗10i那么它的值应该是在第i−xj+1(x∈N)i-xj+1(x\in N)i−xj+1(x∈N)位会有一个kkk。(如109999=1001001.001001001001001001001001\frac{10^9}{999}=1001001.001001001001001001001001999109=1001001.001001001001001001001001)
然后我们看这题,jjj是1∼n1\sim n1∼n的每一个值,那么对于每第iii位我们拆成k∗10ik*10^ik∗10i会对第i−xi-xi−x位产生σ0(x)\sigma_0(x)σ0(x)次贡献(σ0(x)\sigma_0(x)σ0(x)表示xxx的约数个数)。设aia_iai表示第iii位的数,fif_ifi表示第iii位的答案,那么有式子fi=∑j=0∞ai+jσ0(j)f_i=\sum_{j=0}^{\infty}a_{i+j}\sigma_0(j)fi=j=0∑∞ai+jσ0(j)
这个式子可以先预处理出σ0(j)\sigma_0(j)σ0(j)然后把aaa反过来就是一个卷积的式子,FFTFFTFFT优化即可。
对于小数部分,因为在比较后的位数的产生贡献概率极小,又因为数字随机生成,所以我们直接将这些部分省略。我们只处理到小数的121212位,和上面同理算出每一个小数位的贡献即可。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define ll long long
using namespace std;
const ll N=1e6+10;
const double Pi=acos(-1);
struct complex{double x,y;complex(double xx=0,double yy=0){x=xx;y=yy;return;}
}x[N],y[N];
ll n,m,r[N],a[N],d[N],b[N],f[N];
unsigned int sed;
complex operator+(complex x,complex y)
{return complex(x.x+y.x,x.y+y.y);}
complex operator-(complex x,complex y)
{return complex(x.x-y.x,x.y-y.y);}
complex operator*(complex x,complex y)
{return complex(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
void fft(complex *f,ll op){for(ll i=0;i<m;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=m;p<<=1){ll len=p>>1;complex tmp(cos(Pi/len),op*sin(Pi/len));for(ll k=0;k<m;k+=p){complex buf(1,0);for(ll i=k;i<k+len;i++){complex tt=f[i+len]*buf;f[i+len]=f[i]-tt;f[i]=f[i]+tt;buf=buf*tmp;}}}return;
}
void solve(){m=1;ll lg=0;for(;m<=2*n;m<<=1);for(ll i=0;i<=m;i++)r[i]=(r[i>>1]>>1)|((i&1)?(m>>1):0);for(ll i=1;i<=n;i++)x[i]=complex(a[n-i+1],0),y[i]=complex(d[i],0);fft(x,1);fft(y,1);for(ll i=0;i<m;i++)x[i]=x[i]*y[i];fft(x,-1);for(ll i=0;i<m;i++)f[i]=(int)(x[i].x/(double)m+0.5);return;
}
int main()
{scanf("%lld%u",&n,&sed);for(ll i=1;i<=n;i++){a[i]=sed/1024%10;sed=sed*747796405u-1403630843u;}reverse(a+1,a+n+1);ll g=0;for(ll i=1;i<=n;i++){a[i]=a[i]*9+g;g=a[i]/10;a[i]%=10;}if(g)a[++n]=g;for(ll i=2;i<=n;i++)for(ll j=i;j<=n;j+=i)d[j]++;solve();reverse(f+1,f+n+1);ll pw[11];pw[0]=1;for(ll i=1;i<=10;i++)pw[i]=pw[i-1]*10;for(ll i=2;i<=10;i++){ll S=0;for(ll j=1;j<=n;j+=i)for(ll k=1;k<=i;k++)S+=a[j+k-1]*pw[k-1];f[1]+=S/(pw[i]-1); }for(ll i=11;i<=n;i++){for(ll j=1;j<=12;j++)b[j]=0;for(ll j=1;j<=n;j+=i)for(ll k=1;k<=11;k++)b[k]+=a[j+i+k-12];for(ll j=1;j<=11;j++){b[j+1]+=b[j]/10;b[j]%=10;}f[1]+=b[12];}for(ll i=1;i<=n;i++){f[i+1]+=f[i]/10;f[i]%=10;}while(!f[n])n--;while(n)printf("%lld",f[n--]);return 0;
}
jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】相关推荐
- jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】
正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图,第iii个点向第jjj个点(i<j)(i<j)(i< ...
- 【NOI2019模拟2019.7.4】朝夕相处 (动态规划+BM)
Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i ...
- 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)
Description Input Output Sample Input 5 5 2 0 1 5 7 3 -4 2 0 -9 8 3 9 0 7 8 2 -4 5 -7 1 4 5 8 7 0 6 ...
- JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)
Description Solution 考虑分治,将每一个询问挂在包括它的最大的区间中. 只考虑中点往右的区间的贡献,那么每一个点对于覆盖它的最早的时间有一个贡献. 我们建一个虚树,并且用并查集路径 ...
- 【THUWC2019模拟2019.1.18】Counting
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V (V<=100)个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两 ...
- 6009. 【THUWC2019模拟2019.1.18】Counting
题意: 羽月最近发现,她发动能力的过程是这样的: 构建一个 VVV 个点的有向图 GGG,初始为没有任何边,接下来羽月在脑中构建出一个长度为 EEE 的边的序列,序列中元素两两不同,然后羽月将这些边依 ...
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)
Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...
- 【NOI2019模拟2019.6.27】幻化成风(集合容斥系数,胡乱dp)
Description: 题解: xjb乱搞题,卡死在无序了. 考虑肯定是枚举个集合划分,然后强制一个集合里的选的b一样嘛,就可以无限背包了,然后发现如果按题意说的无序的话特别难做,不妨考虑有序,即每 ...
最新文章
- Android .9.png图片的处理
- 记一次 .NET 某三甲医院HIS系统 内存暴涨分析
- notepad++正则表达式去掉关键字所在行
- OpenCV--cvThreshold() 阈值化【转载】
- 正月十五元宵节中国风海报PSD分层模板找灵感!
- 《黑白团团》第九次团队作业:Beta冲刺与验收准备
- python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...
- 孙鑫MFC笔记之十七--HOOK编程
- 【空间分析】5 空间目标形态量测
- Memcache和Redis区别:
- ipad写python代码用什么软件_iPad 能用来写代码吗?有哪些必备软件推荐?
- 纯文字游戏编辑器_重新认识CocosCreator系列之三:立Flag啦,文字游戏编辑器!...
- DIY四旋翼(穿越机)软硬件设计
- 中国最具声望16所大学,国际排名逐个数~
- 前端单行省略号和多行省略号
- C语言中标量变量,如何从标量变量A,B,C和D中产生总线BusQ[0:3]?如何从两条总线B usA[0:3]和BusY[20:15]形成新的总线BusR[10:1...
- Android reckon 控制项目打包版本
- Android:系统日历同步日程
- 全国计算机等级考试 三级网络技术 知识点总结
- unity 陶瓷质感_Unity2D:简单自动瓷砖(Tile)的实现
热门文章
- jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
- lua传值到php,使用lua实现php的var_dump()函数功能
- 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
- eomj表情 mysql_mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: #3...
- linux命令查询邮件发送状态,Linux发邮件之mail命令详解
- python 求和并排序_Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法...
- java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)
- leetcode509. 斐波那契数
- vector容器中重写sort方法
- C++ class实现顺序栈(完整代码)