1968: [Ahoi2005]COMMON 约数研究

Time Limit: 1 Sec Memory Limit: 64 MB

Submit: 1513 Solved: 1154

[Submit][Status][Discuss]

Description

Input

只有一行一个整数 N(0 < N < 1000000)。

Output

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

Sample Input

3

Sample Output

5

HINT

Source

Day2

奇怪的姿势,不过非常神!

求1-n的所有数的约数的个数,不妨可以转化一下,题目中f【i】为i的约数个数,但在做题中不妨从1~枚举i,计算后的f【i】表示1~n中约数包含i的数的个数,即约数i对答案的贡献。

然后,思考快速的方法去实现上述要求,不妨先小规模打表找找规律(于是打出N=14的表):



于是我们发现了一个规律,所有对答案贡献相同的i,是必定相邻的,那么要想优化时间,不妨能够枚举中多步跳跃?

于是开始找规律:

首先,一个数i,它对答案的贡献(1~n中 约数包含i的数的个数)为 n/i下取整…(如何证明?)

十分的简单,首先,假使n%i==0,那么1~n中,约数包含i的数的个数必定是n/i,那么当n%i!=0,那些多出来的数的约数是不含i的,那么剩下的便同整除时一样。得证。。。

那么再发现一个规律, 试计算n/(n/i)(/为C++中整除),i取不同的值,于是发现,在同一个周期中(暂且称那些贡献相同的数为一个周期),上述计算值相同,且都为这个周期的末尾。

于是高效率的做法就是,每次都增加n/(n/i)步,答案用(n/(n/i)-i+1)*(n/i)来统计即可,如此效率大概是O(logn)级的,于是顺利完成。

简短的代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long ans=0;
int n; int main()
{
scanf("%d",&n);
for (int i=1,j=0; i<=n; i=j+1)
j=n/(n/i),ans+=(j-i+1)*(n/i);
printf("%lld\n",ans);
return 0;
}

BZOJ-1968 COMMON 约数研究 数论+奇怪的姿势的更多相关文章

  1. BZOJ1968 [Ahoi2005]COMMON 约数研究 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1968 题意概括 求 ΣF(i)   (1<=i<=n)N<=1000000 F( ...

  2. B1968 [Ahoi2005]COMMON 约数研究 数论

    大水题,一分钟就做完了...直接枚举1~n就行了,然后在n中判断出现多少次. 题干: Description Input 只有一行一个整数 N(0 < N < 1000000). Outp ...

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

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

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

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

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

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

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

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

  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. BZOJ 1968_P1403 [AHOI2005]约数研究--p2260bzoj2956-模积和∑----信息学中的数论分块

    第一部分 P1403 [AHOI2005]约数研究 题目描述 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机“Samuel II”的长时间运算成为了可能.由于在去年一 ...

随机推荐

  1. java 14 - 8 DateFormat

    A.有时候在网站注册账号时,会有日期选项,下面会有一个小型的日历可供选择.这个日期其实是个String类, 选择了日期之后,这个String类会通过程序,转换为Date类,再存入数据库中. B.反之, ...

  2. IOS证书/私钥/代码签名/描述文件

    1.   相关资源 (1)   钥匙串程序(常用工具->钥匙串),用于创建证书请求.安装证书.导出私钥等 (2)   IOS开发中心:https://developer.apple.com/de ...

  3. Oracle Update

    在表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.象sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通 ...

  4. 【C#】WM 消息大全

    消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZE 0x000 ...

  5. php基础24:数组range

    <?php $numbers = range(1, 10); echo "<pre>"; var_dump($numbers); echo "</ ...

  6. Vim中split的使用方法

    Vim中split的使用方法 一.作用 用split可以显示两个不同的文件:或者同时显示一个文件的两个不同地方:又或者并排比较两个文件.这一切都可以通过分割窗口实现.如下图,左边的两个窗口是mytoo ...

  7. webapi同一个Controller多个函数

    现在用webapi发现一个问题,比如用get方法调用的的时候函数名好像没用,不管你写什么名称,它只认调用相同参数的一个函数,而且以get开头的函数虽然名称不同但是只要参数相同就会报错,无法调用怎么回事 ...

  8. Java系列: 关于LinkedList的 ListIterator的add和remove

    static void testListIteratorAdd(){ LinkedList<String> strList = new LinkedList<String>() ...

  9. 20145208《Java程序设计》第2周学习总结

    2015208 <Java程序设计>第2周学习总结 教材学习内容总结 本章内容主要讲了类型.变量与运算符的一些知识,也讲了一些基本的流程语法. 类型 基本类型 整数:short整数(占2字 ...

  10. Pjax.js防刷新技术

    自我感觉良好,所以拿出现在自己用的 Pjax.js 分享给大家 当然 这个版本是 经过本人修改后的版本,跟其它 拿过来就用的 不一样 而且区别还不小 大多的 Pjax 都是 跟后台无关的,而这个版本是 ...