[UOJ62]怎样跑得更快
以下用等号代替同余
这个式子是$\sum\limits_{j=1}^n(i,j)^{c-d}i^dj^dx_j=b_i$
令$g(n)=\sum\limits_{e|n}\mu\left(\frac ne\right)e^{c-d}$,那么原式变为$\sum\limits_{e|i}g(e)\sum\limits_{\substack{e|j\\1\leq j\leq n}}j^dx_j=\frac{b_i}{i^d}$
令$z_e=\sum\limits_{\substack{e|j\\1\leq j\leq n}}j^dx_j$,先处理原式
$\sum\limits_{e|i}g(e)z_e=\frac{b_i}{i^d}\Leftrightarrow g(i)z_i=\sum\limits_{e|i}\mu\left(\frac ie\right)\frac{b_e}{e^d}$
$g(i)$和上式右边都可以$O(n\log n)$预处理,此时如果存在$i$使$g(i)=0$且右边$\ne0$那么无解,两个都是$0$就多解,随便给$z_i$赋值即可
最后求$x_i$:$x_ii^d=\sum\limits_{\substack{i|j\\1\leq j\leq n}}\mu\left(\frac ji\right)z_j$
正如vfk的题解所说:三个莫比乌斯反演掷地有声==
写快速幂时要注意负指数的处理...
#include<stdio.h>
#include<string.h>
char s[4000000];
int ns;
#define NUM(x) ('0'<=x&&x<='9')
inline int rd(){
while(!NUM(s[ns]))ns++;
int x=0;
while(NUM(s[ns]))x=x*10+s[ns++]-'0';
return x;
}
typedef long long ll;
const int mod=998244353,T=100000;
int mul(int a,int b){return(ll)a*b%mod;}
void inc(int&a,int b){(a+=b)%=mod;}
int pow(int a,int b){
int s=1;
while(b<0)b+=mod-1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
int pr[T+10],mu[T+10],nd[T+10],d;
bool np[T+10];
void sieve(){
int i,j,M=0;
mu[1]=1;
nd[1]=1;
for(i=2;i<=T;i++){
if(!np[i]){
pr[++M]=i;
mu[i]=-1;
nd[i]=pow(i,-d);
}
for(j=1;j<=M&&i*pr[j]<=T;j++){
np[i*pr[j]]=1;
nd[i*pr[j]]=mul(nd[i],nd[pr[j]]);
if(i%pr[j]==0)break;
mu[i*pr[j]]=-mu[i];
}
}
}
int b[T+10],g[T+10],h[T+10],n,c;
int main(){
fread(s,1,4000000,stdin);
int q,i,j,t;
n=rd();
c=rd();
d=rd();
q=rd();
sieve();
for(i=1;i<=n;i++){
t=pow(i,c-d);
for(j=1;i*j<=n;j++)inc(g[i*j],mu[j]*t);
}
for(i=1;i<=n;i++)g[i]=pow(g[i],mod-2);
while(q--){
for(i=1;i<=n;i++)b[i]=mul(rd(),nd[i]);
memset(h,0,sizeof(h));
for(i=1;i<=n;i++){
t=b[i];
for(j=1;i*j<=n;j++){
if(mu[j])inc(h[i*j],mu[j]*t);
}
}
for(i=1;i<=n;i++){
if(g[i]==0&&h[i]!=0){
i=-1;
break;
}
h[i]=mul(h[i],g[i]);
}
if(i==-1){
puts("-1");
continue;
}
for(i=1;i<=n;i++){
t=0;
for(j=1;i*j<=n;j++)inc(t,mu[j]*h[i*j]);
t=mul(nd[i],t);
inc(t,mod);
printf("%d ",t);
}
putchar('\n');
}
}
[UOJ62]怎样跑得更快的更多相关文章
- 让DB2跑得更快——DB2内部解析与性能优化
让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!) 洪烨著 2013年10月出版 定价:7 ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- 【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} \] ...
- 面试官:如何写出让 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 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...
随机推荐
- Spring归纳小结(山东数漫江湖)
前言 如果说有什么框架是Java程序员必然会学习.使用到的,那么Spring肯定是其中之一.本篇博客,将根据博主在日常工作中对Spring的使用做一个系统的归纳小结. Spring的一些概念和思想 S ...
- 跨域iframe高度计算
一.同域获取iframe内容 这里有两个细节: 1. 取iframe内的文档对象,标准浏览器使用contentDocument属性,IE低版本(IE6,7,8)使用document属性. 2. cal ...
- 用tkinter实现的gui小工具
import tkinter import requests import json from tkinter import * class FindLocation(object): def __i ...
- 系统调用wait()
进程一旦调用了 wait,就 立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回: ...
- 查看linux 下进程运行时间(转)
原文地址:http://blog.csdn.net/tspangle/article/details/11731317 可通过ps 来查看,通过参数 -o 来查看 如: ps -eo pid,tty, ...
- 虚拟存储管理中几种缺页中断算法(最佳置换法OPT)
缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问. 在进行内存访问时,若所访问的页已在主存,则称此次访问成功: 若所访问的页不在主存,则称此次访问失败,并产生缺页中断. 最佳置换法 ...
- Gas Station——又是一道经典问题
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- Delphi获取毫秒级时间戳
function GetJavaTime( d: TDateTime ): Int64; var dJavaStart: TDateTime; begin //java里的时间是从1970年1月1日0 ...
- 《The art of software testing》的一个例子
这几天一直在看一本书,<The art of software testing>,里面有一个例子挺有感触地,写出来和大家分享一下: [问题] 从输入对话框中读取三个整数值,这三个整数值代表 ...
- electron调用C#应用程序实现串口通信
最近转入零售行业开发了一系列产品,包含便利店收银软件.会员系统.供应链系统.为了追赶潮流,收银软件使用了electron平台开发,界面效果.开发效率确实不错:但是涉及到串口通讯时遇到了麻烦,elect ...