现在,你需要求出该算法所构造出来的序列中‘ab‘子序列的期望个数为多少。显然,该结果可以用P/Q来表示,其中P和Q互质,并且Q≠0,P和Q模数为1e9+7。你需要打印出(P/Q)mod(1e9+7)。
注意,子序列是可以不连续的。
标签:现在 毕业生 有一个 初始 个数 ret 大于等于 namespace alc
现在,你需要求出该算法所构造出来的序列中‘ab‘子序列的期望个数为多少。显然,该结果可以用P/Q来表示,其中P和Q互质,并且Q≠0,P和Q模数为1e9+7。你需要打印出(P/Q)mod(1e9+7)。
注意,子序列是可以不连续的。
1 1 1
2
该算法构造出"ab"概率为1/4,"bbab"概率为1/16,"aab"概率为1/8。但是,该算法不可能构造出"aabab",因为在算法构造出"aab"的时候就已经有了大于等于一个"ab"子序列,就会终止。
原题:
http://codeforces.com/problemset/problem/908/D
题解:
https://blog.csdn.net/jerry99s/article/details/78947763#comments
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 1005; const int MOD = 1000000007; int f[MAXN][MAXN]; int n, m, j, i, k, pa, pb, ans; inline int ksm(int x, int y, int z) { int b = 1 ; while (y) { if (y & 1) b = 1ll * b * x % z; x = 1ll * x * x % z; y >>= 1; } return b; } inline int calc(int x, int y) { if (y >= n) return y; else return f[x][y]; } int main() { cin >> n >> pa >> pb; int w = pa + pb; pa = 1ll * pa * ksm(w, MOD - 2, MOD) % MOD; pb = 1ll * pb * ksm(w, MOD - 2, MOD) % MOD; for(i = 0; i < n; i ++) f[n][i] = (n + i + ksm(pb, MOD - 2, MOD) - 1) % MOD; for(i = n - 1; i >= 0; i --) for(j = n - 1; j >= 0; j --) f[i][j] = (1ll * pa * f[i + 1][j] + 1ll * pb * calc(i, i + j)) % MOD; cout << f[1][0] << endl; }
标签:现在 毕业生 有一个 初始 个数 ret 大于等于 namespace alc
原文地址:https://www.cnblogs.com/qing123tian/p/11110940.html