UOJ #62. 【UR #5】怎样跑得更快
题目分析
显然不可能高斯消元。
考虑反演。
\(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】怎样跑得更快的更多相关文章
- 【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)
[UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- 「UR#5」怎样跑得更快
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
- 让DB2跑得更快——DB2内部解析与性能优化
让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!) 洪烨著 2013年10月出版 定价:7 ...
- 面试官:如何写出让 CPU 跑得更快的代码?
前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...
- [翻译] 5点建议,让iOS程序跑得更快
[文章原地址]http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-5-tips-to-increase-app-performanc ...
- 让你的 Node.js 应用跑得更快的 10 个技巧(转)
Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
- 安装好Windows 8后必做的几件事情,让你的Win8跑的更快更流畅。
1.关闭家庭组,因为这功能会导致硬盘和CPU处于高负荷状态. 关闭方法:Win+C-设置-更改电脑设置-家庭组-离开 如果用不到家庭组可以直接把家庭组服务也给关闭了:控制面板-管理工具-服务-Home ...
- 让你的 Node.js 应用跑得更快的 10 个技巧
Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
- UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...
随机推荐
- awk常用命令总结
awk工具,主要将一行分成“字段”来处理. awk '条件类型1{动作1} 条件类型2{动作2}...‘ filename awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或[tab ...
- input textbox tag
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB0CAIAAACaKavmAAAJ0klEQVR4nO3dO2wb5wHA8YOHIkOLrk
- ubuntu基本配置学习(1)
[转载]源自:http://www.haogongju.net/art/2048612 附加另外一篇文章:http://www.cnblogs.com/vincent-hv/archive/2013/ ...
- gradle -v不是外部命令, 内部命令,或批处理文件
安装完gradle并且配置了环境变量之后,使用windos+R,cmd 进入Dos命令gradle -v检测版本号出现了: 1 --首先找到gradle文件所在目录 一般是在C:\Users\su\. ...
- python os.popen 乱码问题
os.popen('ipconfig') 命令返回的结果在调试时乱码了: output1 = os.popen('ipconfig') o1=output1.read() 我猜这里输出的内容要和控制台 ...
- [ZOJ3316]:Game
题面 vjudge Sol 有一个棋盘,棋盘上有一些棋子,两个人轮流拿棋,第一个人可以随意拿,以后每一个人拿走的棋子与上一个人拿走的棋子的曼哈顿距离不得超过L,无法拿棋的人输,问后手能否胜利 首先距离 ...
- angular2-HttpClient
@angular/common/http中的HttpClient类,Angular 为应用程序提供了一个简化的 API 来实现 HTTP 功能.它基于浏览器提供的XMLHttpRequest接口. H ...
- RN记录
react-native run-android 出现 java.lang.nullpointerexception(no error message) 错误 删除 工程目录\android.grad ...
- Java中生成帮助文档
如何在Java中使用注释 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上.因此,注释是程序源代码的重要组成部分 ...
- SpringBoot如何添加拦截器
在web开发的过程中,为了实现登录权限验证,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢? 步骤如下: 1.继承Web ...