zoukankan      html  css  js  c++  java
  • P2424 约数和

    题目背景

    Smart最近沉迷于对约数的研究中。

    题目描述

    对于一个数X,函数f(X)表示X所有约数的和。例如:f(6)=1+2+3+6=12。对于一个X,Smart可以很快的算出f(X)。现在的问题是,给定两个正整数X,Y(X<Y),Smart希望尽快地算出f(X)+f(X+1)+……+f(Y)的值,你能帮助Smart算出这个值吗?

    输入输出格式

    输入格式:

    输入文件仅一行,两个正整数X和Y(X<Y),表示需要计算f(X)+f(X+1)+……+f(Y)。

    输出格式:

    输出只有一行,为f(X)+f(X+1)+……+f(Y)的值。

    输入输出样例

    输入样例#1:
    2 4
    输出样例#1:
    14
    输入样例#2:
    123 321
    输出样例#2:
    72543

    说明

    对于20%的数据有1≤X<Y≤105。

    对于60%的数据有1≤X<Y≤1*107。

    对于100%的数据有1≤X<Y≤2*109。

    /*
    我们令s[i]=f[1]+f[2]+f[3]+.....
              =[i/1]*1+[i/2]*2+[i/3*3]+.....
    (除法分块)
    然后我们会发现里边有些值是相同的.
    so 我们可以用等差数列加速.
    ans=s[y]-s[x-1].
    */
    #include<cstdio>
    #define ll long long
    using namespace std;
    ll solve(ll n){
        ll tot=0,last;
        for(ll i=1;i<=n;i=last+1){
            last=n/(n/i);
            tot+=n/i*((last+i)*(last-i+1)>>1);
        }
        return tot;
    }
    int main(){
        ll x,y;
        scanf("%lld%lld",&x,&y);
        printf("%lld",solve(y)-solve(x-1));
        return 0;
    }
  • 相关阅读:
    Android Studio学习笔记(1)
    2019全国大学生电子设计大赛总结
    包与常用模块
    模块
    迭代器、生成器与递归调用
    叠加多个装饰器与有参数的装饰器。
    装饰器
    控制指针的移动、函数
    字符编码
    python 数据类型之列表、元组、字典、集合
  • 原文地址:https://www.cnblogs.com/shenben/p/6481288.html
Copyright © 2011-2022 走看看