博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1403 [AHOI2005] 约数研究 [数论分块]
阅读量:4343 次
发布时间:2019-06-07

本文共 904 字,大约阅读时间需要 3 分钟。

  

约数研究

题目描述

科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机“Samuel II”的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩,小联被允许用“Samuel II”进行数学研究。

小联最近在研究和约数有关的问题,他统计每个正数N的约数的个数,并以f(N)来表示。例如12的约数有1、2、3、4、6、12。因此f(12)=6。下表给出了一些f(N)的取值:

f(n)表示n的约数个数,现在给出n,要求求出f(1)到f(n)的总和。

输入输出格式

输入格式:

 

输入一行,一个整数n

 

输出格式:

 

输出一个整数,表示总和

 

输入输出样例

输入样例#1: 
3
输出样例#1: 
5

说明

【数据范围】

20%N<=5000

100%N<=1000000


  分析:

  没错,这是一道非常水的题,但也是一道非常好的数论分块入门题。

  求$1$~$n$的约数个数的和可以转换成求包含$1$~$n$的数的个数和,所以答案就是$\sum^n_{i=1}\frac{n}{i}$。

  但是如果数据范围再大点,比如$n\leq 10^{14}$?这就需要用到数论分块。

  对于某几个$i$,实际上$\frac{n}{i}$的结果都是一样的,所以我们可以直接跳过这一部分,跳到某一个$j$使得$\frac{n}{j}=\frac{n}{i}+1$。这就是数论分块的基本思想。

  Code:

  

//It is made by HolseLee on 12th Sep 2018//Luogu.org P1403#include
int main(){ int n,ans=0; scanf("%d",&n); for(int i=1,j; i<=n; i=j+1) { j=n/(n/i); ans+=(n/i)*(j-i+1); } printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/cytus/p/9641540.html

你可能感兴趣的文章
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
生产订单“生产线别”带入生产入库单
查看>>
crontab导致磁盘空间满问题的解决
查看>>
java基础 第十一章(多态、抽象类、接口、包装类、String)
查看>>
Hadoop 服务器配置的副本数量 管不了客户端
查看>>
欧建新之死
查看>>
自定义滚动条
查看>>
APP开发手记01(app与web的困惑)
查看>>
笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
查看>>
初识前端作业1
查看>>
ffmpeg格式转换命令
查看>>
万方数据知识平台 TFHpple +Xpath解析
查看>>
Hive实现oracle的Minus函数
查看>>