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

bzoj 4407 于神之怒加强版

时间:2020-03-21 21:35:10      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:pre   class   problem   int   code   line   mat   通过   tar   

LINK:于神之怒加强版

这道题用到了几个小技巧。

技术图片

T组数据,\(T\leq 2000\) \(n,m\leq 5000000\)

简单推导一下可以得出\(\sum_{w=1}^n\sum_{d|w}\mu(d)(\frac{w}{d})^k\frac{n}{w}\frac{m}{w}\)

整除分块考虑前面预处理 不要脸的做法是 直接调和级数 加一点小优化\(\mu(x)\)为0的时候没必要枚举,发现可以卡过。

考虑直接线性筛 我们只有对于质数p才快速幂 然后对于p i互质 直接相乘 不互质的时候可以发现要多乘一个\(p^k\)

可以轻松通过。

const int MAXN=5000010;
int n,m,top,T,k,maxx;
int mu[MAXN],p[MAXN],v[MAXN];
ll f[MAXN],w[MAXN];
inline ll ksm(ll b,int p)
{
    ll cnt=1;
    while(p)
    {
        if(p&1)cnt=cnt*b%mod;
        b=b*b%mod;p=p>>1;
    }
    return cnt;
}
inline void prepare()
{
    mu[1]=1;f[1]=1;
    rep(2,maxx,i)
    {
        if(!v[i]){p[++top]=v[i]=i;mu[i]=-1;w[i]=ksm(i,k);f[i]=w[i]-1;}
        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]*w[p[j]]%mod;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]+f[i-1])%mod;
}
int main()
{
    freopen("1.in","r",stdin);
    get(T);get(k);maxx=5000000;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])*w1%mod*w2%mod)%mod;
        }
        putl((ans+mod)%mod);
    }
    return 0;
}

bzoj 4407 于神之怒加强版

标签:pre   class   problem   int   code   line   mat   通过   tar   

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

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