毕业生的序列游戏

Posted qing123tian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业生的序列游戏相关的知识,希望对你有一定的参考价值。

毕业生的序列游戏

题目描述

    对于三个给定的正整数k, PA, PB, 现在有一个序列构造算法: 在初始条件下,有一个空序列,之后每次你会在该序列的末尾添加一个字母‘a‘或‘b‘,添加‘a‘的概率是PA/(PA+PB),添加‘b‘的概率是PB/(PA+PB)。当在该序列中有至少k个子序列为‘ab‘的时候,该构造算法结束。

    现在,你需要求出该算法所构造出来的序列中‘ab‘子序列的期望个数为多少。显然,该结果可以用P/Q来表示,其中P和Q互质,并且Q≠0,P和Q模数为1e9+7。你需要打印出(P/Q)mod(1e9+7)。

注意,子序列是可以不连续的。

输入

第一行包含三个整数k,PA,PB(1≤k≤1000,1≤PA,PB≤1000000)。

输出

输出一个整数

样例输入

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;
 

  

以上是关于毕业生的序列游戏的主要内容,如果未能解决你的问题,请参考以下文章

毕业项目毕业 -- pickle序列化与反序列化操作

基于java的坦克大战游戏的开发设计与实现-(毕业论文+毕业设计源码+答辩PPT).rar

毕业设计 python小游戏设计 - 走迷宫游戏设计与实现

毕业设计游戏商城

游戏商城毕业设计

毕业设计游戏商城项目