定义$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. C++核心编程 4 类和对象-对象的初始化和清理

    构造函数和析构函数 对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题.C++利用了构 ...

  2. 1-Java继承中多态情况特性下变量,方法,静态方法的访问

    在Java继承下,多态特性下类成员访问情况 /* 在继承中,变量时静态的绑定的,非静态方法是动态的绑定的,静态方法是静态绑定的 */ class Parent{ int number = 11; pu ...

  3. PostgreSQL 大小写问题 一键修改表名、字段名为小写

    标准的SQL是不区分大小写的.但是PostgreSQL对于数据库中对象的名字允许使用支持大小写区分的定义和引用方法.方式就是在DDL中用双引号把希望支持大小的对象名括起来.比如希望创建一个叫AAA的表 ...

  4. 洛谷2046 NOI2010海拔

    QwQ题目太长 这里就不复制了 题目 这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ 首先考虑最小割应该怎么做. 有一个性质,就是每个点的海拔要么是1,要么是0 QwQ不过这个我不 ...

  5. [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)

    [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 目录 [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 0x00 摘要 0x01 前文回顾 0x02 Te ...

  6. 4.1 The Example Domain 领域示例代码

    4.1 The Example Domain 领域示例代码 The examples will use some concepts those are used by GitHub, like Iss ...

  7. 2021 从零开始学Git【新版本Git - 8000字详细介绍】

    我写的这篇文章,主要是记录自己的学习过程,也希望帮助读者少踩坑(比如不同版本可能命令不兼容等).本文面向git零基础初学者,建议读者按照文中命令自己全部操作一遍(注意运行环境). 我的运行环境:win ...

  8. Elasticsearch 中为什么选择倒排索引而不选择 B 树索引

    目录 前言 为什么全文索引不使用 B+ 树进行存储 全文检索 正排索引 倒排索引 倒排索引如何存储数据 FOR 压缩 RBM 压缩 倒排索引如何存储 字典树(Tria Tree) FST FSM 构建 ...

  9. JVM:内存结构

    JVM:内存结构 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 P ...

  10. Canal的简单使用

    Canal的简单实用 一.背景 二.canal的工作原理 三.安装canal 1.mysql配置相关 1.检测binlog是否开启 2.mysql开启binlog 3.创建canal用户 2.cana ...