码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 2693 jzptab

时间:2020-03-21 21:43:56      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:点积   swap   部分   tab   筛法   rac   ==   link   前缀   

LINK:[jzptab]

T组数据 \(n,m\leq 1e7\) mod=1e8+9; 求\(\sum{i=1}^n\sum{j=1}^mLCM(i,j)\)

本来不打算写blog的 写完后交了两发 T的飞。

翻了两篇题解才知道自己的复杂度多ln了然后过不去。

可以简单的把式子化成\(\sum_{w=1}^{n}w\sum{d|T}\mu(d)d\cdot sum(\frac{n}{T})\cdot sum(\frac{m}{T})\)

其中sum(x)=1+2+3+...+x; 后面显然可以O(1)求。

整个式子考虑整除分块 考虑前面的东西怎么预处理出来前缀和。

设f(x) 表示 \(x\cdot \sum_{d|x}\mu(d)d\)

我们有一个公式是 \(\sum_{d|x}\mu(d)\frac{x}{d}=\phi(x)\) 和上面那个很相似 但是没乱用。

可以发现对于f(x) 我们枚举i进行调和级数的赋值这样复杂度是In的 没想到1e7没跑过去 可能也有常数的问题。

所以我们只能线性处理f(x)了。f(x)是一个积性函数 因为其为积性函数点积积性函数点积积性函数 或者我们对后半部分线性筛 因为最后还有求前缀和的时候再乘上x也不迟。

\(\sum_{d|x}\mu(d)d\)考虑这个如何线性筛 可以发现很显然。对于积性函数的我们通常筛法 利用积性函数的性质 这个当p|x的时候 显然f(p*x)=f(x);

我之所以说这么多 是有的时候 1e7是过不了一个log的 所以这个时候一定要线性。

int n,m,top,T,maxx;
int mu[MAXN],p[MAXN],v[MAXN];
ll f[MAXN];
inline void prepare()
{
    mu[1]=1;f[1]=1;
    rep(2,maxx,i)
    {
        if(!v[i]){p[++top]=v[i]=i;mu[i]=-1;f[i]=1-i;}
        rep(1,top,j)
        {
            if(maxx/i<p[j])break;
            v[i*p[j]]=p[j];
            if(v[i]==p[j]){f[i*p[j]]=f[i];break;}
            mu[i*p[j]]=-mu[i];
            f[i*p[j]]=f[i]*f[p[j]]%mod;
        }
    }
    rep(1,maxx,i)f[i]=(f[i]*i+f[i-1])%mod;
}
inline ll sum(int x){return (ll)(1+x)*x/2%mod;}
int main()
{
    freopen("1.in","r",stdin);
    get(T);maxx=10000000;prepare();
    while(T--)
    {
        get(n);get(m);
        if(n>m)swap(n,m);
        ll w1,w2,ww,ans=0;
        for(int i=1;i<=n;i=ww+1)
        {
            w1=n/i;w2=m/i;
            ww=min(n/w1,m/w2);
            ans=(ans+(f[ww]-f[i-1])*sum(w1)%mod*sum(w2)%mod)%mod;
        }
        putl((ans+mod)%mod);
    }
    return 0;
}

bzoj 2693 jzptab

标签:点积   swap   部分   tab   筛法   rac   ==   link   前缀   

原文地址:https://www.cnblogs.com/chdy/p/12541742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!