[hdu6987]Cycle Binary
定义$x$为$s$的周期,当且仅当$\forall 1\le i\le |s|-x,s_{i}=s_{i+x}$(字符串下标从1开始)
令$per(s)$为$s$的正周期构成的集合,$\min per(s)$为$s$的最小正周期,显然$\max k=\lfloor\frac{n}{\min per(s)}\rfloor$
由此,不妨枚举$\min per(s)$,令$f(x)$为$\min per(s)=x$的$s$个数,则答案即$\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor f(i)$
关于如何计算$f(i)$,必要条件为$i\in per(s)$,共有$2^{i}$种方案,再去掉$\min per(s)<i$的方案即可
结论:若$x,y\in per(s)$且$x+y\le |s|$,则$\gcd(x,y)\in per(s)$
不妨假设$x<y$,考虑$1\le i\le |s|-(y-x)$,对$i$分类讨论:
1.若$1\le i\le x$,则$i+y\le |s|$,即有$s_{i}=s_{i+y}=s_{i+(y-x)}$
2.若$x<i\le |s|-(y-x)$,即有$s_{i}=s_{i-x}=s_{i+(y-x)}$
综上,可得$y-x\in per(s)$
注意到$\gcd(x,y)=\gcd(x,y-x)$,由此归纳即得证
由此,对于$i\le \lfloor\frac{n}{2}\rfloor$的$f(i)$,若$j=\min per(s)<i$,显然$i+j\le n$,根据此结论即$\gcd(i,j)\in per(s)$,进而不难得到$j=\gcd(i,j)\mid i$
同时若$\min per(s)\mid i$一定有$i\in per(s)$,那么转移即为$f(i)=2^{i}-\sum_{d\mid i,d<i}f(d)$
对于$i>\lfloor\frac{n}{2}\rfloor+1$的$f(i)$,显然其贡献系数为1且$\sum_{i=1}^{n}f(i)=2^{n}$,因此贡献和即$2^{n}-\sum_{i=1}^{\lfloor\frac{n}{2}\rfloor}f(i)$
综上,问题即求$2^{n}+\sum_{i=1}^{\lfloor\frac{n}{2}\rfloor}(\lfloor\frac{n}{i}\rfloor-1)f(i)$,其中$f(i)=2^{i}-\sum_{d\mid i,d<i}f(d)$
构造$h(x)=2^{x}$和$g(x)=1$,不难发现$h=f*g$,即可进行杜教筛
另外,来分析一下杜教筛的复杂度——
令$S(n)=\{\lfloor\frac{n}{i}\rfloor\}$(其中$1\le i\le n$),对$\le B$的$f$线性筛,复杂度即$B+\sum_{x\in S(n),x>B}\sqrt{x}$
对后者放缩,即为$\int_{i=1}^{\frac{n}{B}}\sqrt{\frac{n}{i}}=\sqrt{n}\sqrt{\frac{n}{B}}=\frac{n}{\sqrt{B}}$,显然取$B=n^{\frac{2}{3}}$最优,即得到$o(n^{\frac{2}{3}})$的复杂度
上面是对通常杜教筛的分析,但在本题中,有两个不同的地方:
1.由于贡献系数不同,并不是求一个前缀和,而是要数论分块后求$\sqrt{n}$个前缀和
但考虑数论分块右端点的式子$r=\frac{n}{\frac{n}{i}}$,显然其也属于$S(n)$,因此并不改变复杂度
2.不能对$f$线性筛,预处理复杂度为$B\log B$,那么取$B=(\frac{n}{\log n})^{\frac{2}{3}}$即可(可以适当再调整)
3.计算时需要使用快速幂,但显然这样的复杂度仅为$\sum_{x\in S(n),x>B}\log n$,可以接受
最终,总复杂度为$o(n^{\frac{2}{3}}\log^{\frac{1}{3}}n)$,可以通过
1 #include<bits/stdc++.h>
2 #include<tr1/unordered_map>
3 using namespace std;
4 #define N 5000005
5 #define mod 998244353
6 #define ll long long
7 tr1::unordered_map<int,int>F;
8 int t,n,ans,mi[N],f[N];
9 int qpow(int n,int m){
10 int s=n,ans=1;
11 while (m){
12 if (m&1)ans=(ll)ans*s%mod;
13 s=(ll)s*s%mod;
14 m>>=1;
15 }
16 return ans;
17 }
18 int calc(int n){
19 if (n<N)return f[n];
20 if (F[n])return F[n];
21 int ans=(qpow(2,n+1)-2+mod)%mod;
22 for(int i=2,j;i<=n;i=j+1){
23 j=n/(n/i);
24 ans=(ans-(ll)(j-i+1)*calc(n/i)%mod+mod)%mod;
25 }
26 return F[n]=ans;
27 }
28 int main(){
29 mi[0]=1;
30 for(int i=1;i<N;i++)mi[i]=2*mi[i-1]%mod;
31 for(int i=1;i<N;i++){
32 f[i]=(f[i]+mi[i])%mod;
33 for(int j=2;i*j<N;j++)f[i*j]=(f[i*j]-f[i]+mod)%mod;
34 }
35 for(int i=1;i<N;i++)f[i]=(f[i]+f[i-1])%mod;
36 scanf("%d",&t);
37 while (t--){
38 scanf("%d",&n);
39 ans=qpow(2,n);
40 int lst=0;
41 for(int i=1,j;i<=(n>>1);i=j+1){
42 j=n/(n/i);
43 int now=calc(j);
44 ans=(ans+(ll)(n/i-1)*(now-lst+mod))%mod;
45 lst=now;
46 }
47 printf("%d\n",ans);
48 }
49 return 0;
50 }
[hdu6987]Cycle Binary的更多相关文章
- HDU 6987 - Cycle Binary(找性质+杜教筛)
题面传送门 首先 mol 一发现场 AC 的 csy 神仙 为什么这题现场这么多人过啊啊啊啊啊啊 继续搬运官方题解( 首先对于题目中的 \(k,P\),我们有若存在字符串 \(k,P,P'\) 满 ...
- 莫比乌斯反演&各种筛法
不学莫反,不学狄卷,就不能叫学过数论 事实上大概也不是没学过吧,其实上赛季头一个月我就在学这东西,然鹅当时感觉没学透,连杜教筛复杂度都不会证明,所以现在只好重新来学一遍了(/wq 真·实现了水平的负增 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- Asp.net MVC Request Life Cycle
Asp.net MVC Request Life Cycle While programming with Asp.net MVC, you should be aware of the life o ...
- Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
A code sequence made up multiple instructions and specifying an offset from a base address is identi ...
- 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常. 意思是出现了死循环,也就是Model之间有循环包含关系: ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...
- JS案例之2——cycle元素轮播
元素轮播效果是页面中经常会使用的一种效果.这个例子实现了通过元素的隐藏和显示来表现轮播效果.效果比较简单. 效果图如下: 源代码如下: <!DOCTYPE html> <html&g ...
随机推荐
- bzoj1503 郁闷的出纳员(平衡树,思维)
题目大意: 现在有n个操作和一个最低限度m \(I\)命令\(I\ k\)新建一个工资档案,初始工资为k. \(A\)命令$A\ k $把每位员工的工资加上k \(S\)命令$S\ k $把每位员工的 ...
- ClickHouse 存算分离架构探索
背景 ClickHouse 作为开源 OLAP 引擎,因其出色的性能表现在大数据生态中得到了广泛的应用.区别于 Hadoop 生态组件通常依赖 HDFS 作为底层的数据存储,ClickHouse 使用 ...
- 【UE4 C++】 外部图片读取、Texture 保存 png
蓝图版 导入外部图片 file://E:/UE___Projects_Test/MyProjectAAA/Plugins/WXimage.jpg 导出图图片 一般导出 .hdr 文件 导出 png 设 ...
- LeetCode:树专题
树专题 参考了力扣加加对与树专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 力扣加加-树专题 总结 树的定义 // Definition for a binary tr ...
- MySQL:提高笔记-1
MySQL:提高笔记-1 学完基础的语法后,进一步对 MySQL 进行学习 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门到精通 后做的笔记 1. 索引 1.1 索引概述 M ...
- 极简实用的Asp.NetCore框架再新增商城模块
概述 关于这个框架的背景,在前面我已经交代过了.不清楚的可以查看这个链接 1.极简实用的Asp.NetCore模块化框架决定免费开源了 2.极简实用的Asp.NetCore模块化框架新增CMS模块 算 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
- pyqgis学习细节
关于LIKE通配符:LIKE的意思是模糊匹配,可以和% _搭配,%指的是任意字符,_指的是任一字符.
- USB OTG原理和 ID 检测原理
OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了 电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机 ...
- Spring Security 的注册登录流程
Spring Security 的注册登录流程 数据库字段设计 主要数据库字段要有: 用户的 ID 用户名称 联系电话 登录密码(非明文) UserDTO对象 需要一个数据传输对象来将所有注册信息发送 ...