Description

Input

只有一行一个整数 \(N\)。

Output

只有一行输出,为整数 \(M\),即 \(f(1)\) 到 \(f(N)\) 的累加和。

Sample Input

3

Sample Output

5

HINT

\(0 < N < 1000000\)

Solution

〖线性筛约数个数〗

设 \(d[i]\) 表示 \(i\) 的约数个数,\(num[i]\) 表示 \(i\) 的最小质因子的出现次数。

若 \(i=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n}\),有 \(d[i]=(k_1+1)(k_2+1)\cdots(k_n+1)\)。

  • 若 \(i\) 是质数,则 \(d[i]=2,num[i]=1\)。
  • 若 \(i \bmod p[j] \ne 0\),即 \(i\) 不包含质因子 \(p[j]\),那么 \(d[i\times p[j]]=(k_1+1)(k_2+1)\cdots(k_n+1)(1+1)=d[2]\times 2\),又因为是从小到大枚举,所以 \(p[j]\) 一定是 \(i\times p[j]\) 的最小质因子,那么 \(num[i\times p[j]]=1\)。
  • 若 \(i \bmod p[j]=0\),则 \(p[j]\) 一定是 \(i\) 的最小质因子,那么 \(d[i\times p[j]]=(k_1+1+1)(k_2+1)\cdots(k_n+1)=d[i]/(num[i]+1)\times(num[i]+2),num[i\times p[j]]=num[i]+1\)。
void euler() {
for (int i = 2; i <= n; ++i) {
if (!np[i]) p[++tot] = i, d[i] = 2, num[i] = 1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
np[i * p[j]] = 1;
if (i % p[j] == 0) {
d[i * p[j]] = d[i] / (num[i] + 1) * (num[i] + 2);
num[i * p[j]] = num[i] + 1; break;
}
d[i * p[j]] = d[i] * 2, num[i * p[j]] = 1;
}
}
}

〖线性筛约数和〗

设 \(sd[i]\) 表示 \(i\) 的所有约数之和,则 \(sd[i]=(1+p_1+p_1^2+\cdots+p_1^{k_1})(1+p_2+p_2^2+\cdots+p_2^{k_2})\cdots(1+p_n+p_n^2+\cdots+p_n^{k_n})\)。

若 \(m\) 为 \(i\) 的最小质因子 \(p\) 出现的次数,设 \(sp[i]=1+p+p^2+\cdots+p^m\)。

  • 若 \(i\) 是质数,则 \(sd[i]=sq[i]=i+1\)。
  • 若 \(i\bmod p[j]\ne 0\),则 \(sd[i\times p[j]]=(1+p_1+p_1^2+\cdots+p_1^{k_1})(1+p_2+p_2^2+\cdots+p_2^{k_2})\cdots(1+p_n+p_n^2+\cdots+p_n^{k_n})(1+p[j])\)\(=sd[i]\times (p[j] + 1)\),而 \(p[j]\) 又是 \(i\times p[j]\) 的出现次数最小的质因子,所以 \(sp[i\times p[j]]=p[j]+1\)。
  • 若 \(i\bmod p[j]=0\),则 \(p[j]\) 一定是 \(i\) 的出现次数最小的质因子,则 \(sd[i\times p[j]]=(1+p_1+p_1^2+\cdots+p_1^{k_1}+p_1^{k_1+1})(1+p_2+p_2^2+\cdots+p_2^{k_2})\cdots(1+p_n+p_n^2+\cdots+p_n^{k_n})\)\(=sd[i]/sp[i]\times (sp[i]\times p[j]+1),sp[i\times p[j]]=sp[i]\times p[j]+1\)。
void euler() {
for (int i = 2; i <= n; ++i) {
if (!np[i]) p[++tot] = i, sd[i] = sp[i] = i + 1;
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
np[i * p[j]] = 1;
if (i % p[j] == 0) {
sp[i * p[j]] = sp[i] * (sp[i] * p[j] + 1);
sd[i * p[j]] = sd[i] / sp[i] * sp[i * p[j]]; break;
}
sd[i * p[j]] = sd[i] * (p[j] + 1), sp[i * p[j]] = p[j] + 1;
}
}
}

此题除了用线性筛求解之外,还有一种更优秀的做法:\([1,n]\) 中 \(i\) 总共可以成为 \(\left\lfloor\dfrac{n}{i}\right\rfloor\) 个数的约数,即 \(ans=\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor\),可以用数论分块做到 \(O(\sqrt n)\)。

Code

#include <cstdio>

int main() {
int n, ans = 0; scanf("%d", &n);
for (int i = 1, j; i <= n; i = j + 1)
j = n / (n / i), ans += (j - i + 1) * (n / i);
printf("%d\n", ans);
return 0;
}

[BZOJ 1968] [AHOI 2005] 约数研究的更多相关文章

  1. BZOJ 1968: [Ahoi2005]COMMON 约数研究

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2032  Solved: 1537[Submit] ...

  2. BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  3. BZOJ 1968: [Ahoi2005]COMMON 约数研究(新生必做的水题)

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 2351  Solved: 1797 [Submi ...

  4. BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 题意: 设f(x) = x约数的个数.如:12的约数有1,2,3,4,6,12,所以 ...

  5. bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】

    枚举约数,加上有这个约数的数个数 #include<iostream> #include<cstdio> using namespace std; const int N=10 ...

  6. 1968: [Ahoi2005]COMMON 约数研究

    #include<cstdio> #include<iostream> #define M 1000008 using namespace std; long long tot ...

  7. 【BZOJ】【1968】【AHOI2005】COMMON 约数研究

    数论 原谅我这么傻逼的题都不会做…… 或许写成数学公式的形式比较容易想到解法? $$ans=\sum_{i=1}^n \sum_{d|i} 1$$ ……是不是感觉很水呀……是吧……改成先枚举d再枚举 ...

  8. bzoj千题计划170:bzoj1968: [Ahoi2005]COMMON 约数研究

    http://www.lydsy.com/JudgeOnline/problem.php?id=1968 换个角度 一个数可以成为几个数的约数 #include<cstdio> #incl ...

  9. BZOJ-1968 COMMON 约数研究 数论+奇怪的姿势

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1513 Solved: 1154 [Submit] ...

随机推荐

  1. DWZ富客户端框架(jQuery RIA framework)

    该OA项目前端采用的是DWZ框架来进行实现的. 本来想写点总结的,但发现真没啥好写的.中文的文档,到时候用到直接看文档就好.

  2. Echarts x轴文本内容太长的几种解决方案

    Echarts 标签中文本内容太长的时候怎么办 ? - 1对文本进行倾斜 在xAxis.axisLabe中修改rotate的值 xAxis: { data: ["衬衫11111", ...

  3. fun = [lambda x: x*i for i in range(4)] 本质解析/原理,LEGB规则 闭包原理

    命名空间,闭包原理,参考点击本文 一.问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子 ...

  4. Linux 典型应用之常用命令

    软件操作相关命令 软件包管理 (yum) 安装软件 yum install xxx(软件的名字) 如 yum install vim 卸载软件 yum remove xxx(软件的名字) 如 yum ...

  5. Handling duplicate form submission in Spring MVC

    javaweb开发之防止表单重复提交 - u012843873的博客 - CSDN博客 https://blog.csdn.net/u012843873/article/details/5526212 ...

  6. Windows10 Build 18298 桌面显示计算机(此电脑)

  7. 通过arcmap发布缓存服务,无法选择自定义方案

    出现该问题是因为缓存目录有该缓存信息,清楚掉之后就可以选择自定义方案了

  8. scoketio

    服务器代码let net = require('net'); // 创建服务器 let server = net.createServer(); // 定义一个数组 ,存放每一个连接服务器的客户端用户 ...

  9. RESTful架构详解

    什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移,它首次出现在2000年Roy Fielding的博士论文中.Roy Fieldi ...

  10. 快速理解Git结构

      git pull:拉取远程服务器最新代码到本地(会自动merge) git add:将本地代码添加到暂存区 git commit:将暂存区的所有内容提交到当前分支(git会自动为我们创建第一个分支 ...