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;
    }
  • 相关阅读:
    MySQL日志系统
    MySQL基础架构
    Java操作XML牛逼利器JDOM&DOM4J
    SAX方式解析XML
    DOM方式解析XML
    Jquery Ajax
    Jquery动画效果
    angular6新建项目
    mysql命令行使用
    git常用命令
  • 原文地址:https://www.cnblogs.com/shenben/p/6481288.html
Copyright © 2011-2022 走看看