定义$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的更多相关文章

  1. HDU 6987 - Cycle Binary(找性质+杜教筛)

    题面传送门 首先 mol 一发现场 AC 的 csy 神仙 为什么这题现场这么多人过啊啊啊啊啊啊 继续搬运官方题解( 首先对于题目中的 \(k,P\)​,我们有若存在字符串 \(k,P,P'\)​ 满 ...

  2. 莫比乌斯反演&各种筛法

    不学莫反,不学狄卷,就不能叫学过数论 事实上大概也不是没学过吧,其实上赛季头一个月我就在学这东西,然鹅当时感觉没学透,连杜教筛复杂度都不会证明,所以现在只好重新来学一遍了(/wq 真·实现了水平的负增 ...

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

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

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

  6. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法

    在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常.   意思是出现了死循环,也就是Model之间有循环包含关系: ...

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id

    出现场景:当点击"分类"再返回"首页"时,发生error退出   BUG描述:Caused by: java.lang.IllegalArgumentExcep ...

  9. JS案例之2——cycle元素轮播

    元素轮播效果是页面中经常会使用的一种效果.这个例子实现了通过元素的隐藏和显示来表现轮播效果.效果比较简单. 效果图如下: 源代码如下: <!DOCTYPE html> <html&g ...

随机推荐

  1. == 和 equals区别

    == equals是两种字符串的方式 区别 == 是比较两个对象的引用地址值 equals是比较两个对象的具体内容 示例 package com.oop.demo06; public class De ...

  2. 从零入门 Serverless | 函数计算的可观测性

    作者 | 夏莞 阿里巴巴函数计算团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...

  3. Geostatistical Analyst Tools(Geostatistical Analyst 工具)

    Geostatistical Analyst 工具 1.使用地统计图层 # Process: GA 图层至格网 arcpy.GALayerToGrid_ga("", 输出表面栅格, ...

  4. QQ三国 秘制机簧去哪打?打的太慢?

    我在完成这个任务时卡了很久,因为打的效率极低,因此最后我是如何完成的. 1. 先说打谁吧,刚开始我打机簧蜘蛛,就没打出来过,,后来换了机簧车,掉率就上升了,建议打机簧车. 2. 如果你一直打不出来,建 ...

  5. Mybatis 一级缓存 (20)

    Mybatis中的一级缓存和二级缓存(本博文只是针对一级缓存说明) 概述 ORM框架一般都会有缓存机制,做为其中一员的Mybatis也存在缓存.功能是用以提升查询的效率和服务给数据库带来压力.同样的M ...

  6. 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题

    该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...

  7. 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  8. 初学python-day3 列表

  9. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  10. Spring的Ioc与DI

    一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算 ...