[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] ... 
随机推荐
- Linux或Windows上实现端口映射
			通常服务器会有许多块网卡,因此也可能会连接到不同的网络,在隔离的网络中,某些服务可能会需要进行通信,此时服务器经过配置就可以承担起了转发数据包的功能. 一.Windows下实现端口映射 1. 查询端口 ... 
- 一次Java内存泄露处理手记
			现象 最近项目组从NET平台迁移到Java的Dubbo平台上,由于大家都是Java的生手,发生了蛮多的问题,以后一一记录.现在解决一个遇到的关于Java程序内存泄露的问题. 特别说明 Java萌新,理 ... 
- Python学习第十五篇——类继承和类实例化
			学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ... 
- Python_动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal
			1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1( ... 
- 【学习总结】Git学习-参考廖雪峰老师教程四-时光机穿梭
			学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ... 
- 迁移 VMware 虚拟机到 KVM
			虚拟机转换| VMware vCenter Converterhttps://www.vmware.com/cn/products/converter.html 迁移 VMware 虚拟机到 KVMh ... 
- java list 去重
			Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ... 
- react插件包
			react-scoped-style support ie8,ie8+,chrome,firefox,safari does not support css priority (just apply ... 
- JS刷新当前页面的几种方法总结
			reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页 ... 
- Tomcat启用GZIP压缩,提升web性能
			一.前言 最近做了个项目,遇到这么一个问题:服务器返回给客户端的json数据量太大(大概65M),在客户端加载了1分多钟才渲染完毕,费时耗流量,用户体验极其不好.后来网上搜优化的方法,就是Http压缩 ... 
