[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 ...
随机推荐
- React Native之新架构中的Turbo Module实现原理分析
有段时间没更新博客了,之前计划由浅到深.从应用到原理,更新一些RN的相关博客.之前陆续的更新了6篇RN应用的相关博客(传送门),后边因时间问题没有继续更新.主要是平时空余时间都用来帮着带娃了,不过还是 ...
- 2020.10.23-vj个人赛补题
B - B Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s consistin ...
- HttpClient.PatchAsJsonAsync - dotnet/runtime 项目贡献小记
TL;DR 迫于 PatchAsJsonAsync 方法缺失,我给 dotnet/runtime 项目贡献了相关的 API,可惜要到 .NET7 才能用上. https://github.com/do ...
- [no code][scrum meeting] Alpha 1
项目 内容 会议时间 2020-04-06 会议主题 团队任务分析与拆解 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalo ...
- 洛谷 P4555 [国家集训队]最长双回文串
链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...
- 痞子衡嵌入式:超级下载算法RT-UFL v1.0在Segger Ozone下的使用
痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...
- linux job
通常运行的进程 ctrl-z之后会暂停到后台 bash test.sh Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial #39~16.0 ...
- 斐波那契数列 牛客网 剑指Offer
斐波那契数列 牛客网 剑指Offer 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 class Solution: ...
- hdu 5171 GTY's birthday gift(数学,矩阵快速幂)
题意: 开始时集合中有n个数. 现在要进行k次操作. 每次操作:从集合中挑最大的两个数a,b进行相加,得到的数添加进集合中. 以此反复k次. 问最后集合中所有数的和是多少. (2≤n≤100000,1 ...
- python的分支结构
python分支结构 if结构 python的 if 选择分支结构的基础语法如下,需要注意的是判断条件后面是半角的分号,它的作用相当于Java中的小括号 if 判断条件 : 代码块 elif 判断条件 ...