题目描述

有一个长度为\(n(n\le 10^5)\)的数列,在模\(M\)意义下进行\(m(m \le50000)\)次操作,每次操作形如以下两种形式:

1 \(x\) 表示每个数加\(x(0 \le x<M)\);

2 表示每个数对模数\(M\)取逆元,保证逆元存在。

输出每次操作后所有数的和,对\(M\)取模。这里\(M=998244353\)。

简要题解

设原始数列为\(x_i\)。对于一个初始的数\(x\),经过第i个操作后一定可以写成\(\dfrac {a_i \times x+b_i} {c_i \times x+d_i}\)的形式。先用线性时间求出参量\(a_i,b_i,c_i,d_i\),于是问题转化为对每个\(i\),求出\(\displaystyle \sum\limits_{j = 1}^n {\frac{{{a_i}{x_j} + {b_i}}}{{{c_i}x_j + {d_i}}}} \)。先将整数提取出来,只需考虑\(\displaystyle \sum\limits_{j = 1}^n {\frac{{e_i}}{{{c_i}x_j + {d_i}}}} \)。

(1)若\(c_i=0\),则直接计算即可;

(2)否则,对每个\(i\)可以归一化为求\(\displaystyle \sum\limits_{j = 1}^n {\frac{{{1}}}{{{x_j} + {t_i}}}} \)。

将分母通分,则转化为\(\dfrac {P(t_i)} {Q(t_i)}\),其中\(P,Q\)为\(t_i\)的不超过\(n\)次多项式。

这里\(Q(x)=(x+x_1) \cdots (x+x_n)\)。考虑如何快速求出\(P\)。不难发现\(P\)正是\(Q\)的导数。

于是问题转化成了多点求值问题。可在\(O(n(\log n)^2+m(\log m)^2)\)时间复杂度求解。

还应注意到不会出现\(P(t_i)=Q(t_i)=0\)的情况,因为根据洛必达法则,此时极限趋于无穷大,不会是有限值,而题目保证了逆元存在。

说明

最近看了大量多项式应用的问题,绝大多数都是多项式逆元,这是见到的第一道应用多项式的多点求值的问题(非裸题),搞明白后不禁感叹:好题啊!佩服出题人系列。

核心代码

 int x[], y[], w[], k[];
int ans1[], ans2[];
int main()
{
int n, m, op, t, sum = ;
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++){
scanf("%d", &x[i]);
sum = add(sum, x[i]);
x[i] = -x[i];
}
vector<Poly> v();
mulInit(, n, x, v);
Poly q = v[], p = diff(q);
int a = , b = , c = , d = , cnt = ;
for (int i = ; i < m; i++){
scanf("%d", &op);
if (op == ){
scanf("%d", &t);
a = add(a, mul(t, c));
b = add(b, mul(t, d));
}
else{ swap(a, c); swap(b, d); }
if (c){
int t = power(c, MOD - );
w[i] = mul(mul(a, t), n);
k[i] = mul(sub(b, mul(a, mul(d, t))), t);
y[cnt++] = mul(d, t);
}
else{
int t = power(d, MOD - );
w[i] = mul(add(mul(a, sum), mul(b, n)), t);
k[i] = -;
}
}
mulInit(, cnt, y, v);
getVal(, cnt, p, v, ans1);
getVal(, cnt, q, v, ans2);
for (int i = , j = ; i < m; i++){
if (k[i] == -)printf("%d\n", w[i]);
else{
int t = mul(ans1[j], power(ans2[j], MOD - ));
printf("%d\n", add(w[i], mul(k[i], t)));
j++;
}
}
}

UOJ182 a^-1 + b problem 解题报告的更多相关文章

  1. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  2. HDU p1294 Rooted Trees Problem 解题报告

    http://www.cnblogs.com/keam37/p/3639294.html keam所有 转载请注明出处 Problem Description Give you two definit ...

  3. Winter-2-STL-D The Blocks Problem 解题报告及测试数据

    Time Limit:3000MS     Memory Limit:0KB Description Background Many areas of Computer Science use sim ...

  4. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  5. [poj 2480] Longge's problem 解题报告 (欧拉函数)

    题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...

  6. 【LeetCode】365. Water and Jug Problem 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学题 相似题目 参考资料 日期 题目地址:http ...

  7. codeforces 798C.Mike and gcd problem 解题报告

    题目意思:给出一个n个数的序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] ) 现在需要对序列a进行若干变换,来构造一个beautiful的序列: b1,b2, ...

  8. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  9. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

随机推荐

  1. R语言并行计算中的内存控制

    R语言使用向量化计算,因此非常容易在集群上进行并行计算.parallel 包提供了非常方便的函数用来进行并行计算,但有一个问题是并行时对于内存中的对象会拷贝多份,因此会比较占内存,这里提供一个比较简易 ...

  2. 鹅厂优文|打通小程序音视频和webRTC

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯视频云终端技术总监常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ.QQ物联 等产品 ...

  3. Bash里面如何返回绝对路径

    1.返回当前目录的绝对路径: basepath=$(cd `dirname $0`; pwd) echo $basepath 2.返回当前路径的上一级目录: xp_path=`dirname &quo ...

  4. 【转】H.264RTP封包原理

    原文地址:H.264RTP封包原理   作者:cnp11 1.  引言  随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面 ...

  5. Mybatis 系列3

    系列文章 2 中,我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins ...

  6. MySql常用两大存储引擎简介

    MyISAM存储引擎简介 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.M ...

  7. 注解@PostConstruct与@PreDestroy 特性说明

    简介 Java EE5 引入了@PostConstruct和@PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作.此文主要说明@PostCons ...

  8. RestTemplate的设置和使用

    什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效 ...

  9. Git Submodule简单操作

    基于组件的项目很多,但是如果直接用包的方式直接引用到项目中,如果出现问题很难进行调试的操作,也很难进行组件的优化和管理,所以写了一篇文章来介绍下git submodule的用法,用submodule可 ...

  10. Spring3.1 对Bean Validation规范的新支持(方法级别验证)

    上接Spring提供的BeanPostProcessor的扩展点-1继续学习. 一.Bean Validation框架简介 写道Bean Validation standardizes constra ...