将期望表达式按定义写出后提取公因子,具体步骤:
为了书写方便,令,,特别的令,
单独对的列求和
现在只需求出
很明显这是一个等比数列等差数列,用高中学的错位相减即可求和,求和后再求下极限就可以得出结果式子了。
(这个求和应该不用写了吧,用markdown不怎么好写,要把所有项列出来,不会的可以求助下高中数学老师)
最终对于的所有项都可以先预处理后在复杂度内得到结果,总时间复杂度
const int N = 1e5 + 10, M = 1e6 + 10;
int p[N];
int quickpow(int x, int k)
{
int res = 1;
while(k)
{
if(k & 1) res = res * x % mod1;
k >>= 1;
x = x * x % mod1;
}
return res;
}
int inv(int x)
{
return quickpow(x, mod1 - 2);
}
void solve(int Case)
{
int n = read();
for(int i = 1;i <= n;i ++) p[i] = read();
for(int i = 1;i <= n;i ++)
p[i] = p[i] * inv(100) % mod1;
int q = 1;
for(int i = 1;i <= n;i ++)
q = q * ((1 + mod1 - p[i]) % mod1) % mod1;
int res = 0;
int temp = n * q % mod1 * inv((1 + mod1 - q) % mod1) % mod1 * inv((1 + mod1 - q) % mod1) % mod1;
for(int i = 1, last = 1;i <= n;i ++)
{
res = (res + (i * inv((1 + mod1 - q) % mod1) % mod1 + temp) % mod1 * p[i] % mod1 * last % mod1) % mod1;
last = last * ((1 + mod1 - p[i]) % mod1) % mod1;
}
printf("%lld\n", res);
}
signed main()
{
// ios;
int t = 1;// t = read();
for(int i = 1;i <= t;i ++) solve(i);
return 0;
}