【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)

【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)

题面

UOJ

题解

众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了:
\[\sum_{j=1}^n gcd(i,j)^{c-d}i^dj^dx_j\equiv b_i\]
于是我们就可以写成函数的形式:
\[\sum_{j=1}^n f(gcd(i,j))h(i)h(j)x_j\equiv b_i\]
然后就开始枚举\(gcd\)
\[\begin{aligned} b_i&=\sum_{d=1}^n f(d)\sum_{j=1}^n [gcd(i,j)=d]h(i)h(j)x_j\\ &=\sum_{d=1}^n f(d) \sum_{j=1}^{n}[\frac{gcd(i,j)}{d}=1]h(i)h(j)x_j\\ &=\sum_{d|i} f(d) \sum_{d|j}h(i)h(j)\sum_{k|\frac{gcd(i,j)}{d}}\mu(k)x_j \end{aligned}\]
条件等价于\(kd|gcd(i,j)\),令\(T=kd\)
\[\begin{aligned} b_i&=h(i)\sum_{d|i}f(d)\sum_{d|j}h(j)\sum_{T|gcd(i,j)}\mu(k)x_j\\ &=h(i)\sum_{T|i}\sum_{T|j}\sum_{d|T}f(d)x_j\mu(\frac{T}{d})h(j)\\ &=h(i)\sum_{T|i}\sum_{T|j}g(j)x_j\sum_{d|T}\mu(\frac{T}{d})f(d) \end{aligned}\]
后半部分可以提前预处理出来,记做\(fr(T)\)
继续往下就是:
\[\begin{aligned} b_i&=h(i)\sum_{T|i}\sum_{T|j}h(j)x_j fr(T)\\ &=h(i)\sum_{T|i}fr(T)\sum_{T|j}h(j)x_j \end{aligned}\]
考虑把后半部分的那个东西也给提前算出来,记做\(g(T)\)
那么要求的就变成了\(\displaystyle b_i=h(i)\sum_{T|i}fr(T)g(T)\)
\(gr(T)=fr(T)g(T)\),于是\(\displaystyle b_i=h(i)\sum_{T|i}gr(T)\)
根据莫比乌斯反演可以得到:
\[\frac{b_i}{h(i)}=\sum_{T|i}gr(T)\]
\[gr(i)=\sum_{T|i}\mu(\frac{i}{T})\frac{b_T}{h(T)}\]
\(gr\)是可以算出来的,\(fr\)也是可以算出来的,所以\(g\)也是可以算出来的。
\(\displaystyle g(T)=\sum_{T|j}h(j)x_j\),那么通过莫比乌斯反演可以算出\(h(j)x_j\),直接除掉之后就能算出\(x_j\)了。
如果无解就是存在除法的时候出现了非零数除以\(0\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MOD 998244353
#define MAX 100100
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
int n,C,D,Q;
int pri[MAX],tot,mu[MAX];
bool zs[MAX];
void Sieve()
{
    mu[1]=1;
    for(int i=2;i<=n;++i)
    {
        if(!zs[i])pri[++tot]=i,mu[i]=-1;
        for(int j=1;i*pri[j]<=n;++j)
        {
            zs[i*pri[j]]=true;
            if(i%pri[j]==0)break;
            mu[i*pri[j]]=-mu[i];
        }
    }
}
int b[MAX],gr[MAX],h[MAX],invh[MAX],f[MAX],g[MAX],fr[MAX],w[MAX],invfr[MAX];
int main()
{
    n=read();C=read();D=read();Q=read();Sieve();
    for(int i=1;i<=n;++i)h[i]=fpow(i,D),invh[i]=fpow(h[i],MOD-2);;
    for(int i=1,p=(C-D+MOD-1)%(MOD-1);i<=n;++i)f[i]=fpow(i,p);
    for(int i=1;i<=n;++i)
        for(int j=i;j<=n;j+=i)
            fr[j]=(0ll+fr[j]+mu[j/i]*f[i]+MOD)%MOD;
    for(int i=1;i<=n;++i)invfr[i]=fpow(fr[i],MOD-2);
    while(Q--)
    {
        for(int i=1;i<=n;++i)b[i]=read();
        bool fl=true;
        for(int i=1;i<=n;++i)w[i]=1ll*b[i]*invh[i]%MOD;
        for(int i=1;i<=n;++i)if(b[i]&&!h[i])fl=false;
        for(int i=1;i<=n;++i)gr[i]=0;
        for(int i=1;i<=n;++i)
            for(int j=i;j<=n;j+=i)
                gr[j]=(0ll+gr[j]+mu[j/i]*w[i]+MOD)%MOD;
        for(int i=1;i<=n;++i)g[i]=1ll*gr[i]*invfr[i]%MOD;
        for(int i=1;i<=n;++i)if(gr[i]&&!invfr[i])fl=false;
        for(int i=1;i<=n;++i)w[i]=0;
        for(int i=1;i<=n;++i)
            for(int j=i;j<=n;j+=i)
                w[i]=(0ll+w[i]+mu[j/i]*g[j]+MOD)%MOD;
        for(int i=1;i<=n;++i)if(w[i]&&!h[i])fl=false;
        for(int i=1;i<=n;++i)w[i]=1ll*w[i]*invh[i]%MOD;
        if(!fl){puts("-1");continue;}
        for(int i=1;i<=n;++i)printf("%d ",w[i]);
        puts("");
    }
    return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/11074280.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值