题目分析

显然不可能高斯消元。

考虑反演。

\(b_i=\sum\limits_{j=1}^n\gcd(i,j)^C\cdot \text{lcm}(i,j)^D\cdot x_j\)

\(b_i=\sum\limits_{j=1}^n\gcd(i,j)^C\cdot \frac{i^D\cdot j^D}{\gcd(i,j)^D}\cdot x_j\)

\(b_i=\sum\limits_{j=1}^n\gcd(i,j)^{C-D}\cdot i^D\cdot j^D\cdot x_j\)

实际上形如\(b_i=\sum\limits_{j=1}^nf(\gcd(i,j))\cdot g(i)\cdot h(j)\cdot x_j\)都可以做。

我们按照套路化一下式子。

\(b_i=\sum\limits_{d|i}\sum\limits_{d|j}[\gcd(i,j)=d]\cdot f(d)\cdot g(i)\cdot h(j)\cdot x_j\)

将\([\gcd(i,j)=d]\)换成\(\sum\limits_{k|\frac{\gcd(i,j)}{d}}\mu(k)\)。

\(b_i=\sum\limits_{d|i}\sum\limits_{d|j}\sum\limits_{k|\frac{\gcd(i,j)}{d}}\mu(k)\cdot f(d)\cdot g(i)\cdot h(j)\cdot x_j\)

\(b_i=\sum\limits_{d|i}\sum\limits_{d|j}\sum\limits_{k \cdot d|\gcd(i,j)}\mu(k)\cdot f(d)\cdot g(i)\cdot h(j)\cdot x_j\)

\(b_i=\sum\limits_{T|i}\sum\limits_{T|j}\sum\limits_{d|T}\mu(\frac{T}{d})\cdot f(d)\cdot g(i)\cdot h(j)\cdot x_j\)

\(\frac{b_i}{g(i)}=\sum\limits_{T|i}\sum\limits_{T|j}\sum\limits_{d|T}\mu(\frac{T}{d})\cdot f(d)\cdot h(j)\cdot x_j\)

设\(fr(T)=\sum\limits_{d|T}\mu(\frac{T}{d})\cdot f(d)\)。

\(\frac{b_i}{g(i)}=\sum\limits_{T|i}\sum\limits_{T|j}fr(T)\cdot h(j)\cdot x_j\)

\(\frac{b_i}{g(i)}=\sum\limits_{T|i}fr(T)\sum\limits_{T|j}h(j)\cdot x_j\)

设\(q(T)=\sum\limits_{T|j}h(j)\cdot x_j\)。

\(\frac{b_i}{g(i)}=\sum\limits_{T|i}fr(T)\cdot q(T)\)

\(fr(i)\cdot q(i)=\sum\limits_{T|i}\mu(\frac{i}{T})\cdot \frac{b_T}{g(T)}\)

所以就可以求出\(q(i)\)了。

求出\(q(i)\)后,再次反演,

\(h(i)\cdot x_i=\sum\limits_{i|j}\mu(\frac{j}{i})\cdot q(j)\)

那么就很容易求出\(x_i\)了。

注意一下无解的情况即可。

#include <bits/stdc++.h>
using namespace std;
inline int Getint(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch))ch!='-'?:f=-1,ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
const int Maxn=100005,mod=998244353,pmod=mod-1;
int n,q,c,d,b[Maxn],ans[Maxn],h[Maxn],fr[Maxn],g[Maxn];
int mu[Maxn],Prime[Maxn];
bool vis[Maxn];
ll Pow(ll x,ll k){
ll ret=1;
while(k){
if(k&1)ret=ret*x%mod;
k>>=1;x=x*x%mod;
}
return ret;
}
void init(){
mu[1]=1;
for(int i=2;i<=100000;i++){
if(!vis[i]){Prime[++Prime[0]]=i;mu[i]=-1;}
for(int j=1;j<=Prime[0]&&i*Prime[j]<=100000;j++){
vis[i*Prime[j]]=1;
if(i%Prime[j]==0){mu[i*Prime[j]]=0;break;}
mu[i*Prime[j]]=-mu[i];
}
}
int mi=((c-d)%pmod+pmod)%pmod;
for(int i=1;i<=100000;i++){
int tmp=Pow(i,mi);
for(int j=1;i*j<=100000;j++)
fr[i*j]=(fr[i*j]+(ll)mu[j]*tmp)%mod;
}
for(int i=1;i<=100000;i++)g[i]=Pow(i,d);
}
void solve(){
memset(h,0,sizeof(h));
memset(ans,0,sizeof(ans));
int mi=((-d)%pmod+pmod)%pmod;
for(int i=1;i<=n;i++)b[i]=(ll)b[i]*Pow(i,mi)%mod;
for(int i=1;i<=n;i++)
for(int j=1;i*j<=n;j++)
h[i*j]=(h[i*j]+(ll)mu[j]*b[i])%mod;
for(int i=1;i<=n;i++){
if(fr[i]==0&&h[i]!=0){puts("-1");return;}
h[i]=(ll)h[i]*Pow(fr[i],mod-2)%mod;
}
for(int i=1;i<=n;i++)
for(int j=1;i*j<=n;j++)
ans[i]=(ans[i]+(ll)mu[j]*h[i*j])%mod;
for(int i=1;i<=n;i++){
if(g[i]==0&&ans[i]!=0){puts("-1");return;}
if(g[i])ans[i]=(ll)ans[i]*Pow(g[i],mod-2)%mod;
else ans[i]=0;
}
for(int i=1;i<=n;i++)cout<<(ans[i]+mod)%mod<<" \n"[i==n];
}
int main(){
n=Getint();c=Getint();d=Getint();q=Getint();
init();
while(q--){
for(int i=1;i<=n;i++)b[i]=Getint();
solve();
}
}

UOJ #62. 【UR #5】怎样跑得更快的更多相关文章

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

    [UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...

  2. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  3. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  4. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  5. 面试官:如何写出让 CPU 跑得更快的代码?

    前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...

  6. [翻译] 5点建议,让iOS程序跑得更快

      [文章原地址]http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-5-tips-to-increase-app-performanc ...

  7. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  8. 安装好Windows 8后必做的几件事情,让你的Win8跑的更快更流畅。

    1.关闭家庭组,因为这功能会导致硬盘和CPU处于高负荷状态. 关闭方法:Win+C-设置-更改电脑设置-家庭组-离开 如果用不到家庭组可以直接把家庭组服务也给关闭了:控制面板-管理工具-服务-Home ...

  9. 让你的 Node.js 应用跑得更快的 10 个技巧

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  10. UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...

随机推荐

  1. java文件在没有安装jdk的windows下运行。

    1.首先该工程最好是gui的,使用swing或者awt的都行. 2.使用eclipse打包jar文件. 项目名字上面点右键,选择Export,在选择java\JAR file.    选择src文件夹 ...

  2. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  3. WPF TextBox 聚焦

    1.利用行为 http://blog.csdn.net/lianchangshuai/article/details/9223125 2. 利用装饰器 http://stackoverflow.com ...

  4. 在 Azure WebApps 中运行64位 Asp.net Core 应用

    作为微软下一代的开源的跨平台的开发框架, Asp.net core 正在吸引越来越多的开发者基于其构建现代 web 应用. 目前, Azure App Service 也实现了对 asp.net co ...

  5. CSS3之 :nth-child(n)语法讲解

    语法: E:nth-child(n){ sRules } * 匹配父元素索引为n的子元素E :nth-child(n) 让你匹配到父元素的任一子元素: Figure 1:<section id= ...

  6. C++中细节知识点

    C++中常识小知识: 1.在C++的类中成员变量与成员函数默认为私有的,结构体中的成员变量与成员函数默认为公有的. 2.C++中this关键字是指针,指向当前对象. 3.在C++中一般类的成员变量与成 ...

  7. https、公钥、私钥白话解说

    原文 摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还 ...

  8. C Primer Plus(第六版)中文版 中的错误1

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define TSIZE 45 struct fi ...

  9. Redis安装、配置

    一.Redis安装 Linux安装 下载tar包,移至Linux目录下 解压:tar -zxvf redis-4.0.1.tar.gz 安装gcc:yum install gcc-c++(编译失败需安 ...

  10. Docker网络管理机制实例解析+创建自己Docker网络

    实例解析Docker网络管理机制(bridge network,overlay network),介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Doc ...