P5431 【模板】乘法逆元2
洛谷题目链接
刚开始做乘法逆元还是有点懵逼的~
以下式子都在模\(p\)意义下进行
我们把式子改一下,变成:$$\sum\limits_{i=1}nki\times a_i^{-1}$$
我们先算出\(a_i\)的前缀积:$$s[i]=s[i-1]\times a_i$$
我们发现只要算出每一个前缀积的逆元\(t_i\),每一个\(a_i\)的逆元都好求了:$$a_i^{-1}=t_i\times s_{i-1}$$
那么怎么求每一个前缀积的逆元呢,我们可以先把$t_n运用费马小定理求出来: $$t_n=s_n^{p-2}$$
再根据:$$t_i=t_{i+1}*a_{i+1}$$
递推出所有的\(t\)
这样就把所有的逆元\(O(n)\)求出来了,我们再把原式变形:$$a_1{-1}k1+a_2{-1}k2+\cdots+a_{n-1}{-1}k{n-1}+a_n{-1}kn$$
\]
我们就可以\(O(n)\)求出答案啦~~~
接下来是美滋滋的代码时间~~~(必须用快读。。)
#include<iostream>
#include<cstdio>
#include<cmath>
#define int long long
#define N 5000007
using namespace std;
int n,p,k;
int s[N],a[N],inv_s[N];
int Read()
{
int fu=1,ret=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
fu=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
ret=(ret<<3)+(ret<<1)+c-'0';
c=getchar();
}
return ret*fu;
}
int qpow(int a,int b)
{
int ans=1,res=a;
while(b)
{
if(b&1)
ans=(ans*res)%p;
res=(res*res)%p;
b/=2;
}
return ans%p;
}
signed main()
{
n=Read(),p=Read(),k=Read();
s[0]=1;
for(int i=1;i<=n;++i)
{
a[i]=Read();
s[i]=(s[i-1]*a[i])%p;
}
inv_s[n]=qpow(s[n],p-2);
for(int i=n-1;i>=1;--i)
inv_s[i]=(inv_s[i+1]*a[i+1])%p;
int ans=0;
for(int i=n;i>=1;--i)
ans=((inv_s[i]*s[i-1])%p+ans)*k%p;
printf("%lld\n",(ans+p)%p);
return 0;
}
P5431 【模板】乘法逆元2的更多相关文章
- 【洛谷P3811】[模板]乘法逆元
乘法逆元 题目链接 求逆元的三种方式: 1.扩欧 i*x≡1 (mod p) 可以化为:x*i+y*p=1 exgcd求x即可 inline void exgcd(int a,int b,int &a ...
- 逆元-P3811 【模板】乘法逆元-洛谷luogu
https://www.cnblogs.com/zjp-shadow/p/7773566.html -------------------------------------------------- ...
- P3811 【模板】乘法逆元
P3811 [模板]乘法逆元 线性递推逆元模板 #include<iostream> #include<cstdio> #include<cstring> #def ...
- [洛谷P3811]【模板】乘法逆元
P3811 [模板]乘法逆元 题意 求1-n所有整数在模p意义下的逆元. 分析 逆元 如果x满足\(ax=1(\%p)\)(其中a p是给定的数)那么称\(x\)是在\(%p\)意义下\(a\)的逆元 ...
- 模板【洛谷P3811】 【模板】乘法逆元
P3811 [模板]乘法逆元 给定n,p求1~n中所有整数在模p意义下的乘法逆元. T两个点的费马小定理求法: code: #include <iostream> #include < ...
- luogu P3811 【模板】乘法逆元
题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样 ...
- 洛谷 P3811 【模板】乘法逆元
P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下 ...
- 洛谷——P3811 【模板】乘法逆元
P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...
- 洛谷—— P3811 【模板】乘法逆元
https://www.luogu.org/problem/show?pid=3811 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式 ...
随机推荐
- Go语言学习笔记(8)——包和结构体
包 —— 每个可执行的应用程序必须包含一个主函数,它是执行的入口点.主函数应该存在main包中. 结构体: 通过 . 操作符访问结构体的各个成员! 1. 定义结构体类型person: type per ...
- iTunes向ipad传影片
iTunes向ipad传影片(方法一) 在电脑上用itunes传视频到ipad-百度经验 iTunes向ipad传影片(方法二)
- react组件懒加载
组件懒加载方式-:react新增的lazy const Alert = lazy(() => import('./components/alert')); export default func ...
- mysql授权单个表权限
mysql> create user haochengtest@'%' identified by 'haocheng.123'; Query OK, 0 rows affected (0.01 ...
- 面试必问:Golang高阶-Golang协程实现原理
引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计 ...
- 笔记 - C#从头开始构建编译器 - 2
视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https:// ...
- C++报错:error C3874
解决: 1.class 定义之后不要忘记分号 2.主函数写为int main() { }
- oracle 根据时间字段查询
oracle 根据时间字段查询数据 ROWNUM 是对前面查询的记录做限制,比如查询的记录 > 2000 条,那么只取前面的 2000 条 ''' SELECT * FROM (SELECT C ...
- 快开宝PDA开单器出入库扫码:让批发零售变得更简单
快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...
- [技术翻译]您应该知道的13个有用的JavaScript数组技巧
本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...