传送门: https://ac.nowcoder.com/acm/contest/11161/B
题意
思路
假 设 栈 顶 为 i , 那 么 下 一 个 入 栈 的 必 须 是 i 或 者 i + 1 , 所 以 和 栈 内 的 状 态 无 关 。 假设栈顶为i,那么下一个入栈的必须是i或者i+1,所以和栈内的状态无关。 假设栈顶为i,那么下一个入栈的必须是i或者i+1,所以和栈内的状态无关。
设
当
前
为
i
,
下
一
个
放
入
i
+
1
而
不
是
更
大
的
数
字
的
概
率
为
p
,
则
设当前为i,下一个放入i+1而不是更大的数字的概率为p,则
设当前为i,下一个放入i+1而不是更大的数字的概率为p,则
p
=
f
i
∗
p
+
f
i
+
1
p=f_i*p+f_{i+1}
p=fi∗p+fi+1
则
:
则:
则:
p
=
w
i
+
1
∑
k
=
i
+
1
n
w
k
p=\frac{w_{i+1}}{\sum_{k=i+1}^nw_k}
p=∑k=i+1nwkwi+1
则
:
则:
则:
a
n
s
=
∏
i
=
2
n
p
i
ans=\prod_{i=2}^np_i
ans=i=2∏npi
复 杂 度 O ( n ) d p 。 复杂度O(n)dp。 复杂度O(n)dp。
Code
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll quick_pow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans % mod;
}
void solve() {
int n; cin >> n;
vector<ll> w(n + 100), sum(n + 100);
for(int i = 1;i <= n; i++) cin >> w[i];
for(int i = n;i >= 1; i--) sum[i] = sum[i + 1] + w[i];
ll ans = 1;
for(int i = 2;i <= n; i++) {
ans = ans * w[i] % mod * quick_pow(sum[i] % mod, mod - 2) % mod;
}
cout << ans << endl;
}
signed main() {
solve();
}