原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html

题解

太久没更博客了,该拯救我的博客了。

$$
\sum_{1\leq j \leq n} \gcd(i,j) ^{c-d} i^dj^dx_j = b_i\\
A_i = i^d x_i, B_i = \frac{b_i}{i^d}, f(x) = x^{c-d}\\
f(x) = \sum_{d|x} g(d) \\
\begin{eqnarray*}
\sum_{1\leq j \leq n} f(\gcd(i,j)) A_j&=&B_i\\
\sum_{1\leq j \leq n} \sum_{1\leq d \leq n} [d|i]\cdot[d|j]\cdot g(d) A_j&=&B_i\\
\sum_{1\leq d \leq n} [d|i]g(d) \sum_{1\leq j\leq n}[d|j]A_j &=& B_i\\
\sum_{1\leq d\leq n}[d|i]h(d) &=& B_i\\
\sum_{d|i} h(d)&=&B_i\\
(h(x) &=& g(x) \sum_{d|j} A_j)
\end{eqnarray*}
$$

于是只需要 2 次因数反演,1 次倍数反演,三次莫比乌斯反演就好了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=1;
char ch=getchar();
while (!isdigit(ch)&&ch!='-')
ch=getchar();
if (ch=='-')
f=0,ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?x:-x;
}
const int N=100005,mod=998244353;
void Del(int &x,int y){if ((x-=y)<0) x+=mod; }
void Add(int &x,int y){if ((x+=y)>=mod) x-=mod; }
int n,q,c,d;
int b[N],f[N],g[N],h[N],x[N];
int Pow(int x,int y){
if (y<0)
return Pow(x,y+mod-1);
int ans=1;
for (;y;y>>=1,x=(LL)x*x%mod)
if (y&1)
ans=(LL)ans*x%mod;
return ans;
}
void Mobius(int *f,int *g,int n,int flag){
for (int i=1;i<=n;i++)
g[i]=f[i];
if (flag==0)
for (int i=1;i<=n;i++)
for (int j=i<<1;j<=n;j+=i)
Del(g[j],g[i]);
else
for (int i=n;i>=1;i--)
for (int j=i<<1;j<=n;j+=i)
Del(g[i],g[j]);
}
void solve(){
for (int i=1;i<=n;i++)
b[i]=(LL)read()*Pow(i,mod-1-d)%mod;
Mobius(b,h,n,0);
for (int i=1;i<=n;i++)
if (g[i])
h[i]=(LL)h[i]*Pow(g[i],-1)%mod;
else if (h[i])
return (void)(puts("-1"));
Mobius(h,x,n,1);
for (int i=1;i<=n;i++)
x[i]=(LL)Pow(i,mod-1-d)*x[i]%mod;
for (int i=1;i<=n;i++)
printf("%d ",x[i]);
puts("");
}
int main(){
n=read(),c=read(),d=read(),q=read();
for (int i=1;i<=n;i++)
f[i]=Pow(i,c-d);
Mobius(f,g,n,0);
while (q--)
solve();
return 0;
}

  

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 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

随机推荐

  1. Light OJ 1007

    求区间欧拉函数平方和... 最后因为longlong 范围爆了WA 了, 0.0 #include<bits/stdc++.h> using namespace std; const in ...

  2. python第13天

    装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何改动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等 ...

  3. [MySQL]InnoDB引擎的行锁和表锁

    1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则 ...

  4. mysql·事务挂起

          当开启事务后,程序挂了而事务没有提交,那么会被锁住,报错:连接超时,但不影响查询. 下面操作需要权限     一.查询现在被占用的锁信息 select * from information ...

  5. vue入手

    https://www.jianshu.com/p/dc5057e7ad0d    (最全入坑教程) http://doc.liangxinghua.com/vue-family/1.4.html(v ...

  6. Confluence 6 找到你的支持识别代码(SEN)

    你可以在下面 3 个地方找到你的 SEN 代码: 在 Confluence 中,进入  > 基本配置(General Configuration) > 许可证详细(License Deta ...

  7. axis 数据流

    产生数据流的代码 模板   重新修改了下 :]axis_data_cnt='d0; :]axis_data_frame_cnt='d0; :]delay_cnt='d0; initial begin ...

  8. Socket网络编程(一)

    1.什么是网络通讯?(udp.tcp.netty.mina) udp:漂流瓶,每个人都可以向大海里面扔漂流瓶,不管有没有人捡到.(不管接收方有没有,我只往指定的地址发送东西,64kb以内) tcp:电 ...

  9. LeetCode(85):最大矩形

    Hard! 题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0",&quo ...

  10. hdu3586 树形dp+二分答案

    /* dp[i]表示孤立i结点的费用,二分功率上限w,即dp[i]在选择时不可以选择功率大于w的边 */ #include<bits/stdc++.h> using namespace s ...