Loj#161. 乘法逆元 2

马上就吃饭了写个题解

这个题就是说用了阶乘求逆元的思想
f[i] 前i项a[i]乘积的逆元
真是好题啊

#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
    int w=1,q=0;char ch=' ';
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
    return w*q;
}
const int N = 5e7+5;
int n, mod = 1e9+7;
int a[N];
inline int ksm(int a, int b) {
	int ans = 1, base = a;
	while(b) {
		if(b & 1) ans *= base, ans %= mod;
		base *= base, base %= mod;
		b >>=1;
	}
	return ans % mod;
}
int f[N], g[N];
signed main() {
	cin>>n;
	for(int i = 1; i <= n; i++) 
		a[i] = read();
	int ans = 0;
	g[0] = 1;
	for(int i = 1; i <= n ; i++) g[i] = g[i - 1] * a[i] % mod;
	f[n] = ksm(g[n], mod - 2);
	for(int i = n ; i; i --) f[i - 1] = f[i] * a[i] % mod;
	for(int i = 1; i <= n; i++) {
		ans *= 998244353, ans %= mod;
		ans += (f[i] * g[i - 1]), ans %= mod;
	}
	cout<<ans;
	return 0;
}

posted @ 2020-11-05 18:11  skkyk  阅读(186)  评论(0编辑  收藏  举报