博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LGP5495 Dirichlet 前缀和
阅读量:5146 次
发布时间:2019-06-13

本文共 937 字,大约阅读时间需要 3 分钟。

不是很明白为什么要叫做模板

考虑到\(a_i\)能对\(b_j\)产生贡献,当且仅当\(a_i=\prod p_k^{a_k},b_j=\prod p_k^{b_k},\forall k \ a_k\leq b_k\),于是我们把每一个质数次幂看成一维,相当于对\(a\)数组求一个高维前缀和

于是我们枚举每一个质数次幂,利用高维前缀和的方式来做就行了,复杂度同埃筛\(\operatorname{O(n\ log\ log\ n)}\)

#include
#define re register#define uint unsigned intconst int maxn=2e7+5;uint seed,a[maxn],ans;int n,f[maxn],p[maxn>>2];inline uint getnxt(){ seed^=seed<<13;seed^=seed>>17; seed^=seed<<5;return seed;}int main() { scanf("%d%u",&n,&seed); for(re int i=2;i<=n;i++) { if(!f[i]) p[++p[0]]=i; for(re int j=1;j<=p[0]&&p[j]*i<=n;j++) { f[p[j]*i]=1; if(i%p[j]==0) break; } } for(re int i=1;i<=n;i++) a[i]=getnxt(); for(re int i=1;i<=p[0];i++) for(re int j=2;j*p[i]<=n;j++) a[p[i]*j]+=a[j]; for(re int i=2;i<=n;i++) a[i]+=a[1],ans^=a[i]; printf("%u",ans^a[1]); return 0;}

转载于:https://www.cnblogs.com/asuldb/p/11355745.html

你可能感兴趣的文章
20.网络编程
查看>>
SQL基础
查看>>
C++中公有继承、保护继承、私有继承的区别
查看>>
等价二叉查找树
查看>>
iOS使用StroryBoard页面跳转及传值
查看>>
第二阶段冲刺每日站立会议02
查看>>
kafka基础知识
查看>>
Apache之.htaccess备忘录(一)
查看>>
tarfile zipfile bz2 gz
查看>>
解决脏读等并发问题
查看>>
百度地图通过坐标定位 自己的位置显示小圆点 (精度圈是否显示根据自己喜好) 上图...
查看>>
翻转子串
查看>>
Vue教程:windows下安装npm和cnpm
查看>>
九度OJ 1036:Old Bill (老比尔) (基础题)
查看>>
赠老师们
查看>>
堆的实现
查看>>
Nginx入门
查看>>
Fastreport使用经验
查看>>
CodeForces - 779D
查看>>
ACM~离线莫队算法
查看>>