zoukankan      html  css  js  c++  java
  • 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式)

    传送门:https://ac.nowcoder.com/acm/contest/882/A

    题意:

    给你一个长度为n的环,标号从0~n-1,从0号点出发,每次向左走或者向右走的概率是相同的,问你出发后,经过n-1个点后,恰好到达点m的概率是多少,答案是一个前缀积

    题解:

    讨论两个点的情况:

    点0->1的期望是1

    讨论三个点的情况

    假设我们要到点3,我们必须经过点2,然而我们到了点2可能会再回到点1再到达点3,所以我们讨论必须经过的点2的状态

    倘若要按照题目要求到达点3,我们就必须到达点2,当我们到达点2后,我们有∞种方法到达点3,仔细想一想是不是这样呢?

    我们可能1->2->3,1->2->1->3,1->2->1->2->3,1->2->1->2->1->3.....

    所以这个数列是发散的,我们只需求得到达点2的概率,那么我到达点3的概率就一定是点2的概率,即p=1/2;

    讨论四个点的情况

    我们和上面一样,假设终点是4

    要想按照题目的要求到达点4,我们需要经过1,2,3三个点后 再到达4

    所以我们考虑到达点3的情况

    我们到达点3的概率为

    (frac{1}{4}+frac{1}{8}+frac{1}{16}...)

    为什么?

    讨论前几项 (p(1->2->3)=frac{1}{4})

    (p(1->2->1->2->3)=frac{1}{16})

    (p(1->2->3->2->3)=frac{1}{16})

    ...

    根据1->3之间路径的特点,我们发现,到点3一共有走3步,走5步,走七步...走3+k*2步的这样的情况

    所以到达点3的概率可以发现是一个等比数列和

    (p(3)=frac{1}{4}+frac{1}{8}+frac{1}{16}...=frac{frac{1}{4}*(1-frac{1}{2^∞})}{1-frac{1}{4}}=frac{1}{3})

    到这里我们发现了,我们需要找到暂态为两个点(非0)的 m-1,m+1

    推出规律p=(frac{1}{n-1})

    代码:

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<ctime>
     
    #define fuck(x) cerr<<#x<<" = "<<x<<endl;
    #define debug(a, x) cerr<<#a<<"["<<x<<"] = "<<a[x]<<endl;
    #define ls (t<<1)
    #define rs ((t<<1)|1)
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 100086;
    const int maxm = 100086;
    const int inf = 0x3f3f3f3f;
    const ll Inf = 999999999999999999;
    const int mod = 1000000007;
    const double eps = 1e-6;
     
    const double pi = acos(-1);
     
    ll quick_pow(ll a,ll b){
        ll ans=1;
        while(b){
            if(b&1){ans*=a;ans%=mod;}
            a*=a;a%=mod;
            b>>=1;
        }
        return ans;
    }
     
    int main() {
    //    ios::sync_with_stdio(false);
    //    freopen("in.txt", "r", stdin);
     
        int T;
        scanf("%d",&T);
        ll ans=1;
        while (T--){
            ll a,b;
            scanf("%lld%lld",&a,&b);
            if(a==1){
                ans*=1;
            }else if(b==0){
                ans=0;
            }else{
                ans*=quick_pow(a-1,mod-2);
                ans%=mod;
            }
            printf("%lld
    ",ans);
        }
     
        return 0;
    }
    
  • 相关阅读:
    leetcode144 longest-palindromic-substring
    数据结构之二叉树
    数据结构之堆
    数据结构之图
    数据结构之排序
    数据结构之动态规划
    14 RPC
    数据结构之字符串
    数据结构之散列表
    16 中间人攻击
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/11267149.html
Copyright © 2011-2022 走看看