【UR #5】怎样跑得更快
给定\(n,c,d\)和序列\(\{b_i\}\),求一个序列\(\{x_i\}\)满足
\]
不难将\(\rm lcm(i,j)\)写成\(\frac{i\times j}{\gcd(i,j)}\)
即
\]
套路枚举\(\gcd\),之后套路反演一下,设\(\omega =c-d\)
则
\]
其中\(F(k)=\sum_{k|t}x_tt^d\)
套路地进行简单和式变换
\]
设\(g(n)=\sum_{d|n}\mu(\frac{n}{d})d^{\omega}\)
上式即为
\]
不难发现就是一个函数叫做\(F(k)g(k)\)卷上了一个\(1\)得到了右边那个函数,不妨称之为\(B(i)\)
则\(F(i)g(i)=(\mu\times B)(i)\)
于是\(F(i)=\frac{(\mu\times B)(i)}{g(i)}\),得到\(F\)之后再和\(\mu\)卷一波就能求\(x\)了
卷\(\mu\)完全可以用高维差分优化到\(O(n\log \log n)\),所以要是写个线筛\(i^k\)和离线求逆元就是\(O(qn\log \log n)\)复杂度了
显然我懒得写
代码
#include<bits/stdc++.h>
#define re register
const int maxn=1e5+5;
const int mod=998244353;
inline int dqm(int x){return x<0?x+mod:x;}
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int f[maxn],p[maxn>>1],b[maxn],g[maxn],n,c,d;
inline int ksm(int a,int b) {
b%=(mod-1);if(b<0) b+=mod-1;
int S=1;for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;return S;
}
inline void work() {
for(re int i=1;i<=n;i++) b[i]=1ll*read()*ksm(i,-d)%mod;
for(re int i=1;i<=p[0];++i)
for(re int j=n/p[i];j;--j) b[j*p[i]]=dqm(b[j*p[i]]-b[j]);
for(re int i=1;i<=n;i++)
if(g[i]==0&&b[i]) {puts("-1");return;}else b[i]=1ll*b[i]*g[i]%mod;
for(re int i=1;i<=p[0];++i)
for(re int T=n/p[i],j=1;j<=T;++j) b[j]=dqm(b[j]-b[p[i]*j]);
for(re int i=1;i<=n;i++) printf("%d ",1ll*b[i]*ksm(i,-d)%mod);
puts("");
}
int main() {
n=read(),c=read(),d=read();c%=(mod-1),d%=(mod-1);
for(re int i=2;i<=n;i++) {
if(!f[i]) p[++p[0]]=i;
for(re int j=1;j<=p[0]&&p[j]*i<=n;++j) {
f[p[j]*i]=1;if(i%p[j]==0)break;
}
}
for(re int i=1;i<=n;i++) g[i]=ksm(i,c-d);
for(re int i=p[0];i;--i)
for(re int j=n/p[i];j;--j) g[p[i]*j]=dqm(g[p[i]*j]-g[j]);
for(re int i=1;i<=n;i++) g[i]=ksm(g[i],mod-2);
for(re int Q=read();Q;--Q) work();return 0;
}
【UR #5】怎样跑得更快的更多相关文章
- 【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)
[UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...
- 「UR#5」怎样跑得更快
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- 让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} \ ...
随机推荐
- JSON:结构化数据格式
JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...
- jquery遍历获取带checkbox表格的选中值以及遍历json数组
今天整理了一下jquery遍历的两个用法,分享给大家. 1.$().each 主要用来遍历DOM元素,获取DOM的值或样式等. 2.$.each() 主要用来遍历后台ajax返回的json数组,循环将 ...
- 记录使用node启用微信公众平台服务器配置
在微信公众平台的基本信息里面的,修改服务器配置后会有下面的界面. EncodingAESKey是随机生成的,加密方式根据需要自己选择. 关于URL和Token: URL:填写之后会向这个URL发送一个 ...
- 系统INIT 启动脚本的结构/etc/rc.d/init.d/*
- mysql的一些基本常识
1.主键的选取 主键的字段不能有null存在 主键应该使用bigint自增,而不是int 主键的选取默认为id 联合主键:就是多个字段被设置为主键,这里主键字段的值是允许相同的,只要不是所有字段相同即 ...
- Mysql--08 存储引擎
目录 一.存储引擎简介 二.MySQL自带的存储引擎类型 三.真实企业案例 四.Innodb存储引擎--表空间介绍 一.存储引擎简介  1.文件系统: 1.1 操作系统组织和存取数据的一种机制. 1 ...
- spring中引入多个quertz 注意事项
每一个独立的调取任务 需起不同的名字,否则只有最后一个调度起作用其他不起作用
- mysql,分组后,再次进行过滤
查出平均分大于80以上的班级 select class_id, avg(score) from students group by class_id having avg(score)>80; ...
- C#高级编程笔记 (6至10章节)运算符/委托/字符/正则/集合
数学的复习,4^-2即是1/4/4的意思, 4^2是1*2*2的意思,而10^-2为0.01! 7.2运算符 符号 说明 例 ++ 操作数加1 int i=3; j=i++; 运算后i的值为4,j ...
- html中 的method=post和method=get的区别
1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...