Fear Factoring 除法分块

The Slivians are afraid of factoring; it’s just, well, difficult.

Really, they don’t even care about the factors themselves, just how much they sum to.

We can define F(n)F(n)F(n) as the sum of all of the factors of nnn; so F(6)=12F(6) = 12F(6)=12 and F(12)=28F(12) = 28F(12)=28. Your task is, given two integers aaa and bbb with a≤ba ≤ ba≤b, to calculate S=∑a≤n≤bF(n)S = \sum_{a≤n≤b} F(n)S=∑a≤n≤b​F(n).

1 Input

The input consists of a single line containing space-separated integers aaa and bbb (1≤a≤b≤1012;b−a≤106)(1 ≤ a ≤ b ≤ 10^{12}; b-a ≤ 10^{6} )(1≤a≤b≤1012;b−a≤106).

2 Output

Print SSS on a single line.
样例输入

101 101
28 28
1 10
987654456799 987654456799
963761198400 963761198400
5260013877 5260489265

样例输出

102
56
87
987654456800
5531765944320
4113430571304040

题意:输入a和b,让求由a到b的每一个数的所有因素和。
思路:通过除法分块直接处理a-1和b。

#include <bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
ull qiu(ull a)
{
    ull sum=0;
    ull r;
    ull l=1;
    while(l<=a){
        ull n=a/l;
        ull len=a/n;
        sum+=(len-l+1)*(l+len)/2*n;
        l=len+1;
        //cout<<sum<<endl;
    }
    return sum;
}
int main()
{
    ull a,b;
    while(cin>>a>>b){
        cout<<qiu(b)-qiu(a-1)<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值