線性求逆元
阿新 • • 發佈:2019-03-16
記錄 兩個 復雜 告訴 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; }
線性求逆元