首页 > 其他分享 >第一周 F-乘法逆元2

第一周 F-乘法逆元2

时间:2023-01-09 18:56:46浏览次数:37  
标签:第一周 int ans1 ll long 逆元 inv 乘法

题目描述

这可能是一道模板题。

给定 n 个正整数 ai,求每个数在模 pp 意义下的乘法逆元。

提示:请使用高效的读入方式。

思路

代码

#include <iostream>

#define ll long long
using namespace std;

const int N = 5e6 + 10;
const int p = 1e9 + 7;
const int M = 998244353;

//函数返回类型前加上关键字inline,即可以把函数指定为内联函数。 这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。
inline ll fast_qow(ll a,ll b){
    ll ans1 = 1;
    while(b){
        if(b & 1){ ans1 = (ans1*a) % p;}
        a = (a * a) % p;
        b >>= 1;
    }
    return ans1;
}

ll a[N], S[N], S_inv[N], a_inv[N],m[N];
//n个数 n个数的乘积 n个数逆元的乘积 n个数的逆元 M的n次方
ll n, ans;

int main(){
    cin >> n;
    for(int i = 1; i<= n; i++){
        cin >> a[i];
    }

    m[0] = 1LL;
    //1LL会在运算时把后面的临时数据扩容成long long类型,再在赋值给左边时转回int类型
    for(int i = 1; i < n; i++){
        m[i] = (m[i-1] * M) % p;
    }

    S[0] = 1;
    for(ll i = 1; i <= n; i++){
        S[i] = (S[i - 1] * a[i]) % p;
    }

    S_inv[n] = fast_qow(S[n], p-2);//求总积的逆元
    //将S_inv的1~n-1补齐
    for(int i = n; i >= 1; i--){
        S_inv[i - 1] = (S_inv[i] * a[i]) % p;
    }

    //求每一个数的逆元然后加到ans
    for(int i = 1; i <= n; i++){
        a_inv[i] = (S_inv[i] * S[i - 1]) % p;
        
        //求Σ (a_inv*M^n-1) mod p
        a_inv[i] = (a_inv[i] * m[n - i]) % p;
        //ans = (ans + (a_inv[i]*m[n-i])%p) % p;
        ans = (ans + a_inv[i]) % p;
    }
    cout << ans % p << endl;
    return 0;
}

标签:第一周,int,ans1,ll,long,逆元,inv,乘法
From: https://www.cnblogs.com/Aquarius-CHEqijin/p/17038269.html

相关文章

  • 【算法原理】矩阵乘法
    【算法原理】矩阵乘法一般是矩阵乘法+快速幂,结合\(dp\)普通矩阵乘法:矩阵乘法有结合律,无交换律。因此在计算一长串矩阵相乘的时候,可以依据计算难度选择计算顺序,从而......
  • 矩阵乘法与其运用
    矩阵乘法与其运用(logn递推)规则:1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。\[\left(\begin{matrix}1&2&3\\4&5&6\\\end{matrix}\right)*......
  • python打印乘法口诀、加法口诀、减法口诀,复制到EXCEL直接打印
    #乘法口诀forxinrange(1,10):foryinrange(1,x+1):print(f'{y}x{x}={x*y}',end='\t')print()print('\n')#加法口诀forxinrange(1,10......
  • 2022ACM寒假第一周训练部分题目代码
    在比赛结束后可以查看其他人的代码,这样的是可以查看,若非绿色则对方没公开。1周一1.1A链表应用#include<iostream>#include<list>usingnamespacestd;/*......
  • 寒假训练第一周1.6日cf
    寒假训练第一周1.6日codeforces训练赛A题MediumNumber这道题的思路很简单,主要是一个多次输入的条件。这道题解题方式有多种,我是通过一个sort函数进行排序,然后输出第二......
  • SMU 冬令营第一周蓝桥杯模拟赛
    A.带分数题目:100可以表示为带分数的形式:100=3+69258/714。还可以表示为:100=82+3546/197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这......
  • 多项式乘法(FTT、NTT),但主要是习题
    诈尸。摆了一个多月没写boke的BE是屑。基础知识/模板因为太屑了所以就直接放巨佬们的博客力。快速傅立叶变换[学习笔记&教程]信号,集合,多项式,以及各种......
  • 寒假训练第一周
    寒假训练第一周1.6日codeforces训练赛A题MediumNumber这道题的思路很简单,主要是一个多次输入的条件。这道题解题方式有多种,我是通过一个sort函数进行排序,然后输出第二......
  • 第一周训练赛2
    ProblemA题目描述https://atcoder.jp/contests/abc266/tasks/abc266_a?lang=en代码#include<iostream>usingnamespacestd;intmain(){stringS;whi......
  • 十六进制加法、乘法表
    1+1=21+2=3  2+2=41+3=4  2+3=5  3+3=61+4=5  2+4=6  3+4=7  4+4=81+5=6  2+5=7  3+5=8  4+5=9  5+5=A1+6=7  2+6=8  3+6=9  ......