https://odzkskevi.qnssl.com/3b068390f8a2f00b5e1927f3e846ed02?v=1535638189
于是我们得到的这一个区间的每个因数的数量都是 (n/l)
这些因数有哪些呢? 当然就是 l−rl−r 里头这些啦
然后很显然这些因数构成了一个等差数列, 单对于这一区间因数来说, 其和为 (l+r)∗(r−l+1)/2(l+r)∗(r−l+1)/2
每个因数有 (n/l)(n/l) 个, 所以这一区间对答案的贡献为 (n/l)∗(l+r)∗(r−l+1)/2
#include <iostream>
using namespace std;
typedef unsigned long long ll;
ll check(ll x)
{
ll ans=0;
for(ll i=1,j; i<=x;i=j+1)
{
j=x/(x/i);
ans+=(i+j)*(j-i+1)*(x/i)/2;
}
return ans;
}
int main()
{
ll a,b;
while(cin>>a>>b)
cout<<check(b)-check(a-1)<<endl;
return 0;
}
unsigned 无符号类型,既没有负号,可以扩大正数范围。