1. 程式人生 > >線性求逆元

線性求逆元

記錄 兩個 復雜 告訴 urn lin UNC 我們 i+1

線性求逆元


你需要以\(O(n)\)的時間復雜度預處理處 任意 n個數的逆元
記錄一下lunch告訴我的方法 :

處理出 : \(s[i]=\prod_{k=1}^{i}a[k] \quad\) 時間 :\(O(n)\)
*註 : 累乘就好

處理出 : \(invs[n]=s[n]^{-1}\quad\) 時間 :\(O(log_2mod)\)
*註 : ksm / Exgcd

處理出 : \(invs[i]=s[i]^{-1}\quad\) 時間 :\(O(n)\)
*註 : \(invs[i]=invs[i+1]*a[i+1]\) , \(O(n)\)遞推就好

好了 , 利用這兩個前綴積 , 我們有 : \(a[i]^{-1} = s[i-1]*invs[i]\)

這麽SB我咋就想不到呢

code :

int n
int a[MAXN(n)];
int s[MAXN(n)];
int invs[MAXN(n)];
int inv[MAXN(n)];

int main(){
    r(n);s[0]=1;
    for(int i=1;i<=n;i=-~i)
        r(a[i]);s[i]=1ll*s[i-1]*a[i]%mod;
    invs[n]=fpm(s[n],mod-2);
    for(int i=n-1;i>=1;i=~(-i))
        invs[i]=1ll*invs[i+1]*a[i+1]%mod;
    for(int i=1;i<=n;i=-~i)
        inv[i]=1ll*s[i-1]*invs[i]%mod;
    return 0;
}

線性求逆元