Gym - 101652P Fear Factoring

Fear Factoring
题 意:输入a,b让你求[a,b]所有的数的因数和。
数据范围:
1<=a<=b<=1e12
0<=b-a<=1e6

输入样例:

101 101

输出样例:

102

思 路:我们先求这个[1,n]所有的数因数和,然后用cal(b)-cal(a-1)就是[a,b]内的所有因数和了。问题是怎么求这个cal(b)呢?用的是除法分块的思想,例如11在100种是多少个数的因数,就等于100/21向下取整4次。那么在100种只是9个数的因数的最大值是多少呢?100/(100/21) =25 并且21到25全部都最多是4个数的因数。并且这也是保证不超时的原因。

收 获:这方面的以前写过一个,但是没写博客,没及时复习,又忘记了,只不过这个比那个更难点把,还是很有意思的

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull a,b;
ull cal(ull x){
    ull sum = 0;
    ull t=0;
    for(ull i=1;i<=x;i=t+1){
        t=x/(x/i);
        sum += (i+t)*(t-i+1)/2*(x/i);
    }
    return sum;
}
int main(){
    while(~scanf("%llu %llu",&a,&b)){
        printf("%llu\n",cal(b) - cal(a-1));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37129433/article/details/81809323