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;
}