2019頭の牛のオフより学校2番目のフィールドAエディウォーカー(確率式プッシュ)

2019頭の牛のオフより学校2番目のフィールドAエディウォーカー(確率式プッシュ)

ポータル:https://ac.nowcoder.com/acm/contest/882/A

質問の意味:

あなたはポイント0から始まる、長さn、0〜から参照番号N-1のループを与えた後、左または右が同じで毎回ダウンする確率は、あなたがポイントn-1の後に開始頼みます、正確点mに到達する確率は、その答えは、製品の接頭番号であります

ソリューション:

議論の二点:

1の所望の点> 1 0-

議論の三点

我々は、我々は、2を指している必要があり3を指すようにしたいと仮定したが、我々は戻ってポイントを再びポイント3に達する1に行くことが2を指すように持っているので、我々はポイント2の状態を議論する必要があります

あなたは対象の要件に応じて、ポイント3に到達したい場合は、我々は慎重に考えて、我々はポイント2に到達したとき、我々はポイント3に到達するための∞の方法があり、ポイント2に到達しなければならない、それはそうではないのですか?

我々よい1-> 2-> 3,1> 2-> 1-> 3,1> 2-> 1-> 2-> 3,1> 2-> 1-> 2-> 1-> 3 .....

だから、このシリーズは発散され、我々は、私はポイント3確率は2を指している必要があり、それの確率で到達、ポイント2の確率に達した取得する必要があり、すなわち、P = 1/2;

議論の4つのポイント

我々と、上記端部は4であると仮定

対象者の要件に合わせて点4に到達するために、我々は3つのポイント1、2、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との間のパスの特性は、我々は見つけ、そのような場合...離れて行く、5歩の距離3、3つの段階、合計を指すように7-3 + K * 2つのステップを行きます

したがって、ポイント3に到達する確率を求めることができる幾何学的配列であり

\(P(3)= \ FRAC {1} {4} + \ FRAC {1} {8} + \ FRAC {1} {16} ... = FRAC \ {\ FRAC {1} {4}(* FRAC \ 1- {1} {2 ^∞})} {1- FRAC \ {1} {4}} = \ FRAC {1}、{3} \)

ここでは、我々は、M-1、M + 1の2つの過渡ポイント(非ゼロ)を見つける必要があり見つけます

放出法= P (\ \ {FRAC。1. 1-N-} {} \)

コード:

#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\n",ans);
    }
 
    return 0;
}

おすすめ

転載: www.cnblogs.com/buerdepepeqi/p/11267149.html