题目链接: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 约数研究:数学【思维题】的更多相关文章

  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 约数研究【枚举】

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

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

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

  6. [BZOJ1968][AHOI2005]COMMON约数研究 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 直接计算每个因子的贡献就可以了. $Ans=\sum_{i=1}^n[\frac{n ...

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

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

  8. [Ahoi2005]COMMON 约数研究 【欧拉线性筛的应用】

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

  9. BZOJ1968 [Ahoi2005]COMMON 约数研究

    Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...

随机推荐

  1. SQL Server的Bug

    SQL 语句如下: SELECT * FROM Production.Product WHERE ProductNumber IN(SELECT ProductNumber FROM HumanRes ...

  2. echarts图标相关

    图标类型参考地址: http://echarts.baidu.com/echarts2/doc/doc.html 知识点一: 堆叠柱状图与普通柱状图的区别在于: 堆叠柱状图 在series中需要设置  ...

  3. Django-rest-framework(五)自定义功能

    我们可以在settings.py文件中定义登录,权限,分页,异常等的全局配置,如下所示 REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'utils.pa ...

  4. 在Oracle中计算两个日期间隔的天数、月数和年数

    一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy')-to_date('07/01/2015','mm/ ...

  5. git使用简介(一)

    附上廖雪峰老师Git教程https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 创建版本 ...

  6. AOJ 0531 坐标离散化

    涂色:(日文题目,自己翻译成了中文)为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌.三合板上不需要涂色的部分预先贴好了护板.被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色. 请编 ...

  7. 替换html里面的\r\n及解决记事本中的每个段落只有一行的情形

    1. 在用python爬取小说的时候, 发现在内容里每次换行都有\r\n(即回车, 换行)出现. 此时可以采用  s.replace('\\r\\n','') , 其中s为字符串类型. 2. 在爬取完 ...

  8. C#中委托和代理的深刻理解(转载)

    在写代码的过程中遇到了一个问题,就是" .net CallbackOnCollectedDelegate 垃圾回收问题. " 使用全局钩子的时候出现: globalKeyboard ...

  9. jquery图片滚动jquery.scrlooAnimation.js

    ;(function ($, window, document, undefined) { var pluginName = "scrollAnimations", /** * T ...

  10. PyCharm入门第一步-——创建并运行第一个Python项目

    创建项目 点击Create New Project 创建项目 输入自己的项目名,点击Create创建 创建文件 右键项目名创建python文件 创建一个HelloPython文件 输入print(&q ...