zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门

    约数研究

    题目描述

    科学家们在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}$。

      但是如果数据范围再大点,比如$nleq 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<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+=(n/i)*(j-i+1);
        }
        printf("%d",ans); return 0;
    }
  • 相关阅读:
    JS: 子项可以来回交换的两个下拉列表
    DOM事件
    DOM基础2——元素
    DOM基础1
    JS: 随机点名程序与万年历
    G_S男女匹配算法(算法的第一个程序2016.09.19)
    Java IO流详尽解析(大神之作)
    细讲解JAVA中的IO流
    c++运算符的优先级(收好不谢)
    java程序——输出当月日历表
  • 原文地址:https://www.cnblogs.com/cytus/p/9641540.html
Copyright © 2011-2022 走看看