Refer

主要思路参考了 Command_block 的题解。

Description

给定 \(n\)(\(n\le 10^{10}\)),求

\[\sum_{i=1}^n\sigma_0(i^2) \mod 2^{64}
\]

Solution

首先有一个惯例套路:

\[\sigma_0(i\cdot j)=\sum_{x|i}\sum_{y|j}\left[\gcd(x,y)=1\right]
\]

[SDOI2015]约数个数和 以及 BZOJ4176 Lucas的数论 中,我们将这个式子继续化成如下模样,就可以做了:

\[\sigma_0(i\cdot j)=\sum_{t|i,t|j}\mu(t)\cdot d\left(\frac{i}{t}\right)\cdot d\left(\frac{j}{t}\right)
\]

最后的结果长这样:(然后就可以杜教筛了)

\[\sum_{i=1}^n\sum_{j=1}^nd(i\cdot j)=\sum_{t=1}^n\mu(t)\cdot\left(\sum_{i=1}^{\left[\frac{n}{t}\right]}d(i)\right)^2
\]

但是这题的这样算结果长这样:

\[\sum_{i=1}^nd(i^2)=\sum_{t=1}^n\mu(t)\cdot\left(\sum_{i=1}^{\left[\frac{n}{t}\right]}d(i)^2\right)
\]

这就不太能做。可见,思维僵化的推导方法有时根本行不通。考虑不反演,直接先枚举 \(x\)、\(y\)。

\[\sum_{i=1}^n\sigma_0(i)=\sum_{i=1}^n\sum_{x|i}\sum_{y|i}\left[\gcd(x,y)=1\right]=\sum_{x=1}^n\sum_{y=1}^n[\gcd(x,y)=1]\cdot \left(\sum_t[x|t,y|t,t\le n]\right)
\]

因为 \(x\)、\(y\) 互质,所以 \(\sum[x|t,y|t,t\le n]=\left[\frac{n}{xy}\right]\),这就是个比较简洁的式子了:

\[\sum_{i=1}^n\sigma_0(i)=\sum_{x=1}^n\sum_{y=1}^n[\gcd(x,y)=1]\cdot\left[\frac{n}{xy}\right]
\]

这时摆在我们面前的最常见的做法是把 \(\gcd(x,y)=1\) 拆开来,但是这回,常见的套路并没有成功。我们需要的是一种全新的方法——构造另一个函数并使用反演公式。设:

\[f(n,t)=\sum_{x=1}^n\sum_{y=1}^n[\gcd(x,y)=t]\cdot\left[\frac{n}{xy}\right]
\]
\[F(n,t)=\sum_{x=1}^n\sum_{y=1}^n[t|\gcd(x,y)]\cdot\left[\frac{n}{xy}\right]
\]

于是得到:

\[F(n,t)=\sum_{k=1}^{+\infty}f(n,kt) \Rightarrow f(n,t)=\sum_{k=1}^{+\infty}\mu(k)\cdot f(n,kt)
\]

我们要求的答案是 \(f(n,1)\)。考虑怎么推这个 \(F\),接下来按套路走就可以辣:

\[F(n,t)=\sum_{T=1}^n \left[\frac{n}{T}\right]\sum_{x|T}\left[t|\gcd(T,\frac{T}x)\right]
\]

仔细看就可以发现 \(t|x,t^2|T\),可以得到:

\[F(n,t)=\sum_{T=1}^{\left[\frac{n}{t^2}\right]}\left[\frac{n}{Tt^2}\right]\cdot d(T)
\]

总的式子就是:

\[\sum_{i=1}^n\sigma_0(i)=\sum_{t=1}^{\sqrt n}\mu(t)\sum_{T=1}^{\left[\frac{n}{t^2}\right]}\left[\frac{n}{Tt^2}\right]\cdot d(T)
\]

\(d\) 的前缀和可以用类似杜教筛的方法得到,前面的部分,假设第二个求和它是除以 \(t\) (往大了放缩) 的时候复杂度可以分析出是和杜教筛一样的,于是总复杂度就是 \(O(n^{\frac{2}{3}})\)。

Code

在 vjudge 上交过了,洛谷还在 Waiting。

SP20173 DIVCNT2 - Counting Divisors (square)的更多相关文章

  1. SPOJ 20713 DIVCNT2 - Counting Divisors (square)

    DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ​0​​ ...

  2. [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)

    题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0​(n) be the number of positive diviso ...

  3. SPOJ : DIVCNT2 - Counting Divisors (square)

    设 \[f(n)=\sum_{d|n}\mu^2(d)\] 则 \[\begin{eqnarray*}\sigma_0(n^2)&=&\sum_{d|n}f(d)\\ans&= ...

  4. DIVCNT2&&3 - Counting Divisors

    DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...

  5. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  6. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  7. hdu 6069 Counting Divisors 筛法

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  8. 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...

  9. hdu6069 Counting Divisors 晒区间素数

    /** 题目:hdu6069 Counting Divisors 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意:求[l,r]内所有数的k次方 ...

随机推荐

  1. 80. 删除有序数组中的重复项 II

    题目 给你一个有序数组 nums ,请你原地删除重复出现的元素(不需要考虑数组中超出新长度后面的元素),使每个元素最多出现两次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入 ...

  2. kivy Label触发事件

    kivy  label也可以触发事件,为什么只有我这么无聊学垃圾kivy """ 在通过ref标记一段文本后点击这段文本就可以触发'on_ref_press'事件,在该事 ...

  3. BUAA_2020_软件工程_热身作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 热身作业要求 我在这个课程的目标 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方面 ...

  4. 使用json-path解析json

    在我们的日常开发中,有时候需要从一个json字符串中获取一个值,或者从一段json字符串中获取到某些值,如果先使用Gson或Jackson转换成java对象在获取值,有些时候是很麻烦的,那么有没有一种 ...

  5. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  6. 关于把RTL工程代码封装成IP时对define宏定义参数的处理

    在把RTL工程封装成IP的时候,如果工程中的代码中含有global include中定义的参数,则vivado不支持该参数文件的封装.出现IP_FLOW 19-4646的错误代码,解决方法: 1.在用 ...

  7. Python 语法错误 except Exception, e: ^ SyntaxError: invalid syntax

    出这个问题是因为python2和python3 语法有些不同 python2 和 3 处理 except 子句的语法有点不同,需要注意: Python2 try: print ("hello ...

  8. path-sum-ii leetcode C++

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  9. Java中Lambda表达式的进化之路

    Lambda表达式的进化之路 为什么要使用Lambda表达式 可以简洁代码,提高代码的可读性 可以避免匿名内部类定义过多导致逻辑紊乱 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实 ...

  10. 装了这几个IDEA插件,基本上一站式开发了!

    前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错. 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDEA插件中,我独钟爱这 ...