BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968
题意:
设f(x) = x约数的个数。如:12的约数有1,2,3,4,6,12,所以f(12) = 6。
给定n,问你f(1)到f(n)之和。
题解:
好多做法。。。
(1)O(N*sqrt(N))
纯暴力(应该过不了)。
枚举i,sqrt(i)复杂度求出约数个数,更新ans。
不附代码。
(2)O(N*log(N))
若当前枚举到i,则i为i*k的一个约数(k >= 0),dp[i*k]++。
先枚举i,再枚举i*k,复杂度 = n * (1 + 1/2 + 1/3 + 1/4 +...+ 1/n) = N*log(N)
(3)O(N)
转化问题:
设g(x) = [1,n]中x倍数的个数。
ans = ∑ g(i)
显然有g(x) = floor(n/x),O(1)算出。
枚举i,ans += g(i),复杂度O(N)。
(4)O(sqrt(N))
延续(3)的思路。
显然,对于数列g(x),你会发现有一些区间内的数都是一样的。
那么哪些g(x)会是相同的呢?
假如现在枚举到了i。
由于 g(x) = floor(n/i)
所以有 n/i = g(i) ... P(余数)
那么现在想求出这段区间的末尾位置j,即求出满足n/j = g(i) ... P,显然当P(余数)越接近0时,j越大。
所以当P约等于0时,末尾位置j = floor(n/g(i)) = floor(n/floor(n/i))。
所以下一个区间的起始位置为j+1。
所以对于处理的每个i,要将ans += (j-i+1) * g(i)
复杂度 = 不同的floor(n/i)的个数 = sqrt(N)
看下效率差距。。。(从下往上为算法2,3,4)

AC Code(2):
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005 using namespace std; int n;
int ans=;
int dp[MAX_N]; int main()
{
cin>>n;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int j=i;j<=n;j+=i)
{
dp[j]++;
}
ans+=dp[i];
}
cout<<ans<<endl;
}
AC Code(3):
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int n;
int ans=; int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
ans+=n/i;
}
cout<<ans<<endl;
}
AC Code(4):
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int n;
int ans=; int main()
{
cin>>n;
for(int i=,j=;i<=n;i=j+)
{
j=n/(n/i);
ans+=(j-i+)*(n/i);
}
cout<<ans<<endl;
}
BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】的更多相关文章
- 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 约数研究【枚举】
枚举约数,加上有这个约数的数个数 #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 ...
- [BZOJ1968][AHOI2005]COMMON约数研究 数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 直接计算每个因子的贡献就可以了. $Ans=\sum_{i=1}^n[\frac{n ...
- bzoj千题计划170:bzoj1968: [Ahoi2005]COMMON 约数研究
http://www.lydsy.com/JudgeOnline/problem.php?id=1968 换个角度 一个数可以成为几个数的约数 #include<cstdio> #incl ...
- [Ahoi2005]COMMON 约数研究 【欧拉线性筛的应用】
1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2939 Solved: 2169 [Submi ...
- BZOJ1968 [Ahoi2005]COMMON 约数研究
Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...
随机推荐
- HDU 2795 Billboard 【线段树维护区间最大值&&查询变形】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard Time Limit: 20000/8000 MS (Java/Others) ...
- POJ 2704 Pascal's Travels 【DFS记忆化搜索】
题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS Memory Limit: 65536K Tota ...
- require,import区别?
遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...
- Jquery Mobile 常用参数
data-role 属性值: data-role参数表: page 页面容器,其内部的mobile元素将会继承这个容器上所设置的属性 header 页面标题容器,这个容器内部 ...
- .NET中Ajax跨越访问
说明:我们知道Ajax是不能进行跨域请求的,我们是可以设置我们的项目让Ajax支持跨域访问. 跨域: aa.xxx.com 中用ajax请求 bb.ccc.com中的数据成为跨域. 找了一些文章看了 ...
- [HNOI2003]操作系统(优先队列,堆排序)
题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...
- Linux计算某一列的和
ll | awk '{print $5}' | egrep -v "^$"| paste -sd+|bc 简单说明: ll:拿到当前目录下所有的文件大小 awk:拿到第几列 egr ...
- Sonar安装-Linux[20171227]
前言 一款不错的代码质量管理工具Sonar 前期准备 官方参考文档 https://docs.sonarqube.org/display/SONAR/Documentation ...
- 模块importlib介绍
importlib包的目的是双重的.一个是在Python源代码中提供import语句(以及扩展名为__import__()函数)的实现.这提供了可以移植到任何Python解释器的import的实现.这 ...
- angularjs1+requirejs+ bootstrap+ jQuery低版本配合兼容ie8+浏览器
angularjs兼容低版本IE浏览器(IE8)angularjs在1.3之后的版本都是选择放弃对IE8及更低IE版本的支持,但是就目前的开发形式来看,IE8的使用客户还是蛮多的,最近有个项目要求尽量 ...