UOJ182 a^-1 + b problem 解题报告
题目描述
有一个长度为\(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 解题报告的更多相关文章
- codeforces B. Routine Problem 解题报告
题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...
- HDU p1294 Rooted Trees Problem 解题报告
http://www.cnblogs.com/keam37/p/3639294.html keam所有 转载请注明出处 Problem Description Give you two definit ...
- Winter-2-STL-D The Blocks Problem 解题报告及测试数据
Time Limit:3000MS Memory Limit:0KB Description Background Many areas of Computer Science use sim ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- [poj 2480] Longge's problem 解题报告 (欧拉函数)
题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...
- 【LeetCode】365. Water and Jug Problem 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学题 相似题目 参考资料 日期 题目地址:http ...
- codeforces 798C.Mike and gcd problem 解题报告
题目意思:给出一个n个数的序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] ) 现在需要对序列a进行若干变换,来构造一个beautiful的序列: b1,b2, ...
- Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告
Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
随机推荐
- 终结python协程----从yield到actor模型的实现
把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...
- CRM客户关系管理系统(十)
第十章.kingadmin+admin+actions功能开发 10.1. django admin的action 可以自己写个函数执行批量操作 crm/admin.py 后台admin actio ...
- 多线程编程 NSOperation
前言 1.NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NSOper ...
- 【.Net架构】BIM软件架构03:Web管控平台MVC架构
一.前言 上一篇讲述的是将BIM平台后台架构CoreService.sln,该解决方案主要作用是对管控平台的核心业务进行封装,然后让前端的ApiController去调用该解决方案中的对 ...
- Razor视图
@{ string name="jerry";} <div> @name </div> //显示jerry @{ string js="& ...
- Flask框架之 - 简易静态网站 !
网站截图: Python源代码如下: # coding=utf-8 from flask import Flask,render_template app = Flask(__name__) @app ...
- 与班尼特·胡迪一起找简单规律(HZOJ-2262)
与班尼特·胡迪一起找简单规律 Time Limit: 1 s Memory Limit: 256 MB Description 班尼特·胡迪发现了一个简单规律 给定一个数列,1 , 1 ...
- ccf 目录格式转换
任务背景: 在网络上获取的ccf目录的格式是PDF,但是要进行数据分析时,PDF格式的数据是不符合要求的,因此需要将pdf格式转化为excel格式 任务目的: 将pdf格式的CCF目录转化为excel ...
- docker学习笔记(一)—— ubuntu16.04下安装docker
docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...
- Beta项目总结
Beta冲刺成员名单和工作量比例 姓名 学号 负责内容 工作量比例 张梨贤 170327109 负责企业人员的委托/收回授权.第三方机构的委托授权管理.分级统计展示.分级列表展示 26% 黄腾飞 17 ...