[BZOJ 1968] [AHOI 2005] 约数研究
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] 约数研究的更多相关文章
- BZOJ 1968: [Ahoi2005]COMMON 约数研究
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2032 Solved: 1537[Submit] ...
- BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- BZOJ 1968: [Ahoi2005]COMMON 约数研究(新生必做的水题)
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2351 Solved: 1797 [Submi ...
- BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 题意: 设f(x) = x约数的个数.如:12的约数有1,2,3,4,6,12,所以 ...
- bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
枚举约数,加上有这个约数的数个数 #include<iostream> #include<cstdio> using namespace std; const int N=10 ...
- 1968: [Ahoi2005]COMMON 约数研究
#include<cstdio> #include<iostream> #define M 1000008 using namespace std; long long tot ...
- 【BZOJ】【1968】【AHOI2005】COMMON 约数研究
数论 原谅我这么傻逼的题都不会做…… 或许写成数学公式的形式比较容易想到解法? $$ans=\sum_{i=1}^n \sum_{d|i} 1$$ ……是不是感觉很水呀……是吧……改成先枚举d再枚举 ...
- bzoj千题计划170:bzoj1968: [Ahoi2005]COMMON 约数研究
http://www.lydsy.com/JudgeOnline/problem.php?id=1968 换个角度 一个数可以成为几个数的约数 #include<cstdio> #incl ...
- BZOJ-1968 COMMON 约数研究 数论+奇怪的姿势
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1513 Solved: 1154 [Submit] ...
随机推荐
- 【php增删改查实例】第二十六节 - 个人详情页制作
在一般的系统中,当用户点击头像的时候,就会跳转到对应的个人详情页,在这个页面,他可以查看和修改自己的个人信息,或者更换头像. 本案例中,个人详情页使用bootstrap框架. 首先,我们新建一个htm ...
- Java线程和线程池
Android中创建线程的方式有,new Thread,new Thread(Runnable),new Thread(Callable)的形式. A. 直接new Thread简单方便. B. ne ...
- 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页
从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn,然后以每天一篇的速度进 ...
- 便于记忆的SA构造
首先学习基数排序. memset(b, 0, sizeof(b)); for(int i = 0; i < n; i++) b[a[i]]++; for(int i = 1; i <= m ...
- session与cookie的区别以及HTML5中WebStorage理解
一.session与cookie的区别 二.HTML5中WebStorage理解 WebStorage的目的是克服由cookie所带来的一些限制,当数据需要被严格控制在客户端时,不需要持续的将数据发回 ...
- vmware can not be closed virtual machine is busy
VMware does not close when Windows Server 2003 ... |VMware Communities https://communities.vmware.co ...
- Java 基本数据类型 及 == 与 equals 方法的区别
Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ...
- [转帖]cmd批处理常用符号详解
cmd批处理常用符号详解 https://www.jb51.net/article/32866.htm 很多符号 还是不清楚的.. 批处理能够极大的提高 工作效率 需要加强深入学习. 1.@一般在 ...
- PhpStorm 头部注释、类注释和函数注释的设置
*设置位置:"Settings"->"file templates"; 如下图,设置头部注释.类注释以及函数注释,时间.用户名.文件名称等随机改变的属性, ...
- CentOS7安装Jenkins自动化部署maven项目
前言: 最近要弄一个jenkins工具,已经安装好了并且jenkins使用部署项目的流程已经基本走通,上图: 话不多说,开始 第一步:安装jenkins: [ 准备环境: 在centOS7环境上:安装 ...