正题

题目链接: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∑n​oneness(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−1​n​⌋=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(nlog⁡n)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】相关推荐

  1. jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】

    正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图,第iii个点向第jjj个点(i<j)(i<j)(i< ...

  2. 【NOI2019模拟2019.7.4】朝夕相处 (动态规划+BM)

    Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i ...

  3. 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 ...

  4. JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)

    Description Solution 考虑分治,将每一个询问挂在包括它的最大的区间中. 只考虑中点往右的区间的贡献,那么每一个点对于覆盖它的最早的时间有一个贡献. 我们建一个虚树,并且用并查集路径 ...

  5. 【THUWC2019模拟2019.1.18】Counting

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V (V<=100)个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两 ...

  6. 6009. 【THUWC2019模拟2019.1.18】Counting

    题意: 羽月最近发现,她发动能力的过程是这样的: 构建一个 VVV 个点的有向图 GGG,初始为没有任何边,接下来羽月在脑中构建出一个长度为 EEE 的边的序列,序列中元素两两不同,然后羽月将这些边依 ...

  7. jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...

  8. 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)

    Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...

  9. 【NOI2019模拟2019.6.27】幻化成风(集合容斥系数,胡乱dp)

    Description: 题解: xjb乱搞题,卡死在无序了. 考虑肯定是枚举个集合划分,然后强制一个集合里的选的b一样嘛,就可以无限背包了,然后发现如果按题意说的无序的话特别难做,不妨考虑有序,即每 ...

最新文章

  1. Android .9.png图片的处理
  2. 记一次 .NET 某三甲医院HIS系统 内存暴涨分析
  3. notepad++正则表达式去掉关键字所在行
  4. OpenCV--cvThreshold() 阈值化【转载】
  5. 正月十五元宵节中国风海报PSD分层模板找灵感!
  6. 《黑白团团》第九次团队作业:Beta冲刺与验收准备
  7. python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...
  8. 孙鑫MFC笔记之十七--HOOK编程
  9. 【空间分析】5 空间目标形态量测
  10. Memcache和Redis区别:
  11. ipad写python代码用什么软件_iPad 能用来写代码吗?有哪些必备软件推荐?
  12. 纯文字游戏编辑器_重新认识CocosCreator系列之三:立Flag啦,文字游戏编辑器!...
  13. DIY四旋翼(穿越机)软硬件设计
  14. 中国最具声望16所大学,国际排名逐个数~
  15. 前端单行省略号和多行省略号
  16. C语言中标量变量,如何从标量变量A,B,C和D中产生总线BusQ[0:3]?如何从两条总线B usA[0:3]和BusY[20:15]形成新的总线BusR[10:1...
  17. Android reckon 控制项目打包版本
  18. Android:系统日历同步日程
  19. 全国计算机等级考试 三级网络技术 知识点总结
  20. unity 陶瓷质感_Unity2D:简单自动瓷砖(Tile)的实现

热门文章

  1. jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
  2. lua传值到php,使用lua实现php的var_dump()函数功能
  3. 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
  4. eomj表情 mysql_mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: #3...
  5. linux命令查询邮件发送状态,Linux发邮件之mail命令详解
  6. python 求和并排序_Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法...
  7. java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)
  8. leetcode509. 斐波那契数
  9. vector容器中重写sort方法
  10. C++ class实现顺序栈(完整代码)