定义$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. 在 ASP.NET Core 中自动启用 CAP 事务

    本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要 ...

  2. HTML模板标签解析

    HTML基本模板 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta cha ...

  3. PowerDotNet平台化软件架构设计与实现系列(02):数据库管理平台

    为了DB复用和简化管理,我们对常见应用依赖的DB模块进行更高级的提取和抽象. 虽然一些ORM可以简化DB开发,但是我们还是需要进行改进和优化,否则应用越多,后期管理运维越混乱. 根据常见开发需要,数据 ...

  4. jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)

    一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...

  5. java设计模式_单例模式

    懒汉式 非线程安全 特点:Lazy 初始化.非多线程安全.易实现 描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程.因为没有加锁 synchronized,所以严格意义上它并不算单 ...

  6. python函数参数类型:位置参数、默认参数、动态参数、关键字参数

    1.位置参数:调用函数的时候传的参数,参数默认按顺序赋值,如果是指定那个参数赋值,不关注顺序.指定参数a=1,b=2 就在函数体内a=1,b=2 2.默认参数:在定义函数的时候,给某个参数设置默认值 ...

  7. mysql join语句的执行流程是怎么样的

    mysql join语句的执行流程是怎么样的 join语句是使用十分频繁的sql语句,同样结果的join语句,写法不同会有非常大的性能差距. select * from t1 straight_joi ...

  8. springboot事务的传播行为和隔离级别

    springboot事务的传播行为和隔离级别 在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的 传播行为定义了7种,分别用0-6来表示 ...

  9. 分布式系统ID

    Leaf--美团点评分布式ID生成系统 前言 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需 ...

  10. 在Excel中,不利用任何第三方工具,生成二维码

    有同事提需求,要批量生成二维码.谈了之后,我觉得可以做个excel文件,把要打印的内容放进去,然后给每行数据生成一个二维码.下一步就要在Excel里面生成二维码.问了一下度娘,貌似都得利用一些第三方工 ...