hdu6711 Touma Kazusa's function

鏈接

點擊跳轉

先來看看求的是什麼東西

cic_i表示數字ii在給定區間中出現了幾次,n=107n=10^7

i=lrj=lrφ(gcd(ai,aj))lcm(ai,aj) \sum_{i=l}^r \sum_{j=l}^r \varphi(gcd(a_i,a_j)) lcm(a_i,a_j)

=i=1nj=1nφ(gcd(i,j))lcm(i,j)cicj = \sum_{i=1}^n \sum_{j=1}^n \varphi(gcd(i,j)) lcm(i,j) c_i c_j

=d=1ndi=1ndj=1ndφ(d)ijcidcjd[(i,j)=1] = \sum_{d=1}^n d \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} \sum_{j=1}^{\lfloor\frac{n}{d}\rfloor} \varphi(d) ij c_{id} c_{jd} [(i,j)=1]

=d=1ndi=1ndj=1ndφ(d)ijcidcjdtitjμ(t) = \sum_{d=1}^n d \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor} \sum_{j=1}^{\lfloor\frac{n}{d}\rfloor} \varphi(d) ij c_{id} c_{jd} \sum_{ t|i \wedge t|j } \mu(t)

=d=1ndφ(d)t=1ndt2μ(t)i=1ndtj=1ndtijcidtcjdt = \sum_{d=1}^n d\varphi(d) \sum_{t=1}^{\lfloor\frac{n}{d}\rfloor} t^2 \mu(t) \sum_{i=1}^{\lfloor\frac{n}{dt}\rfloor} \sum_{j=1}^{\lfloor\frac{n}{dt}\rfloor} ij c_{idt} c_{jdt}

=d=1ndφ(d)t=1ndt2μ(t)(i=1ndticidt)2 = \sum_{d=1}^n d\varphi(d) \sum_{t=1}^{\lfloor\frac{n}{d}\rfloor} t^2 \mu(t) ( \sum_{i=1}^{\lfloor\frac{n}{dt}\rfloor} i c_{idt} )^2

換元,令T=dtT=dt

=T=1ndTdφ(d)T2d2μ(Td)(i=1nTiciT)2= \sum_{T=1}^n \sum_{d|T} d\varphi(d) \frac{T^2}{d^2} \mu(\frac{T}{d}) ( \sum_{i=1}^{\lfloor\frac{n}{T}\rfloor} i c_{iT} )^2

注意看g(T)=dTdφ(d)T2d2μ(Td)g(T) = \sum_{d|T} d\varphi(d) \frac{T^2}{d^2} \mu(\frac{T}{d})

這玩意是個積性函數,對T=pkT=p^k分析發現,g(T)=Tμ(T)g(T) = T\mu(T)

上式接着化簡

ans=T=1nTμ(T)(i=1nTiciT)2ans = \sum_{T=1}^n T\mu(T) ( \sum_{i=1}^{\lfloor\frac{n}{T}\rfloor} i c_{iT} )^2

莫隊搞一搞

別以爲到這裏就結束了

卡常簡直把我給搞自閉了

必須寫的優美否則就會TLETLE成狗

我的自閉過程:
在這裏插入圖片描述

代碼

#include <bits/stdc++.h>
#define maxn 100010
#define maxN 10000010
#define rep(_,__) for(_=1;_<=(__);_++)
#define sqr(x) ((x)*(x))
using namespace std;
typedef unsigned int uint;
typedef pair<uint,uint> pr;
uint prime[maxN/10], mu[maxN];
bool mark[maxN];
void shai(uint N)
{
    uint i, j;
    for(i=2;i<=N;i++)mark[i]=false;
    *prime=0;
    mu[1]=1;
    for(i=2;i<=N;i++)
    {
        if(!mark[i])prime[++*prime]=i, mu[i]=-1;
        for(j=1;j<=*prime and i*prime[j]<=N;j++)
        {
            mark[i*prime[j]]=true;
            if(i%prime[j]==0)break;
            mu[i*prime[j]]=-mu[i];
        }
    }
}
uint l[maxn], r[maxn], id[maxn], s[maxN], now, a[maxn], ans[maxn], S;
vector<pr> d[maxn];
void init()
{
    uint i, j;
    shai(10000000);
}
bool cmp(uint x, uint y)
{
    if(l[x]/S==l[y]/S)return r[x]<r[y];
    return l[x]/S < l[y]/S;
}
void upd(uint x, bool pos, vector<pr> &d)
{
    for(auto T:d)
    {
        uint dlt = pos ? x/T.first : -(x/T.first);
        now += T.second*dlt*((s[T.first]<<1)+dlt);
        s[T.first] += dlt;
    }
}
uint read(uint x=0)
{
    uint c;
    for(c=getchar();!isdigit(c);c=getchar());
    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    return x;
}
int main()
{
    uint T, n, q, i, L, R, j;
    init();
    T=read();
    while(T--)
    {
        n=read(), q=read();
        S = sqrt(n);
        rep(i,n)
        {
            a[i]=read();
            d[i].clear();
            for(j=1;j*j<=a[i];j++)
                if(a[i]%j==0)
                {
                    if(mu[j])
                        d[i].emplace_back(pr(j,j*mu[j]));
                    if(j!=a[i]/j and mu[a[i]/j])
                        d[i].emplace_back(pr(a[i]/j,a[i]/j*mu[a[i]/j]));
                    s[j]=s[a[i]/j]=0;
                }
        }
        rep(i,q)
        {
            l[i]=read(), r[i]=read();
            id[i]=i;
        }
        sort(id+1,id+q+1,cmp);
        now = 0;
        L=1, R=0;
        rep(i,q)
        {
            for(;L<l[id[i]];L++)upd(a[L],false,d[L]);
            for(;L>l[id[i]];L--)upd(a[L-1],true,d[L-1]);
            for(;R>r[id[i]];R--)upd(a[R],false,d[R]);
            for(;R<r[id[i]];R++)upd(a[R+1],true,d[R+1]);
            ans[id[i]]=now;
        }
        rep(i,q)
        {
            printf("%u\n",ans[i]);
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章