1. 程式人生 > >除法分塊—因數貢獻度

除法分塊—因數貢獻度

於是我們得到的這一個區間的每個因數的數量都是 (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  無符號型別,既沒有負號,可以擴大正數範圍。