• 【题解】[UOJ 62] UR #5 怎样跑得更快【莫比乌斯反演】


    题目链接

    题意

    给定 (n,c,d,q)(q) 次给定 (b_1,dots b_n),解方程组:

    [sum_{j = 1}^{n} gcd(i, j)^c cdot operatorname{lcm}(i, j)^d cdot x_j equiv b_i pmod{p} ]

    (nleq 3 imes 10^5)(qleq 3)

    题解

    (operatorname{lcm}(x,y)=dfrac{xy}{gcd(x,y)})

    原式相当于是

    [sum_{j = 1}^{n} f(gcd(i,j))g(i)h(j) x_iequiv b_i pmod{p} ]

    稍微化一下:

    [sum_{j = 1}^{n} f(gcd(i,j))x'_jequiv b'_i pmod{p} ]

    [sum_{j = 1}^{n} sum_{d|i,d|j} (f*mu)(d)x'_jequiv b'_i pmod{p} ]

    [sum_{d|i} (f*mu)(d) sum_{j=1}^{n} [d|j]x'_jequiv b'_i pmod{p} ]

    (z(d)=sum_{j=1}^{n} [d|j]x'_j)

    [sum_{d|i} (f*mucdot z)(d)equiv b'_i pmod{p} ]

    [((f*mucdot z)*1)(i)equiv b'_i pmod{p} ]

    [(f*mucdot z)equiv b'*mu pmod{p} ]

    [zequiv dfrac{b'*mu}{f*mu} pmod{p} ]

    求出 (z) 后再莫反得 (x_i),一共 3 个莫反。(b'*mu)(f*mu) 点除时可能有无解或多解。

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=998244353;
    int qpow(int x,int y){
        int ans=1;
        while(y){
            if(y&1)ans=ans*1ll*x%mod;
            x=x*1ll*x%mod;
            y>>=1;
        }
        return ans;
    }
    const int N=1e5+10;
    int b[N],x[N],n,c,d,q;
    int ipw[N];
    int f[N],i_f[N],fz[N],z[N];
    
    int main(){
        scanf("%d%d%d%d",&n,&c,&d,&q);
        c%=mod-1;d%=mod-1;
        for(int i=1;i<=n;i++)ipw[i]=qpow(i,mod-1-d);
        for(int i=1;i<=n;i++)f[i]=qpow(i,mod-1+c-d);
        for(int i=1;i<=n;i++)
            for(int j=i+i;j<=n;j+=i)
                f[j]=(f[j]+mod-f[i])%mod;
        for(int i=1;i<=n;i++)i_f[i]=qpow(f[i],mod-2);
        while(q--){
            for(int i=1;i<=n;i++)scanf("%d",b+i);
            for(int i=1;i<=n;i++)fz[i]=b[i]*1ll*ipw[i]%mod;
            for(int i=1;i<=n;i++)
                for(int j=i+i;j<=n;j+=i)
                    fz[j]=(fz[j]+mod-fz[i])%mod;
            bool ok=1;
            for(int i=1;i<=n;i++){
                if(!f[i]){
                    if(fz[i]){
                        ok=0;
                        break;
                    }else x[i]=0;
                }else x[i]=fz[i]*1ll*i_f[i]%mod;
            }
            if(!ok){
                puts("-1");
                continue;
            }
            for(int i=n;i>=1;i--)
                for(int j=i+i;j<=n;j+=i)
                    x[i]=(x[i]+mod-x[j])%mod;
            for(int i=1;i<=n;i++)x[i]=x[i]*1ll*ipw[i]%mod;
            for(int i=1;i<=n;i++)printf("%d ",x[i]);printf("
    ");
        }
    }
    
    
    知识共享许可协议
    若文章内无特别说明,公开文章采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
  • 相关阅读:
    Jsuop Whitelist
    Conductor
    nats
    jersey
    Metrics
    OpenResty api 网关
    DHCP、DHCP Snooping及DHCP relay工作原理入门及实践(转)
    使用派生镜像(qcow2)
    websockify文档
    noVNC使用——访问多台vnc
  • 原文地址:https://www.cnblogs.com/wallbreaker5th/p/14187899.html
Copyright © 2020-2023  润新知