1. 程式人生 > >Codeforces 908D New Year and Arbitrary Arrangement

Codeforces 908D New Year and Arbitrary Arrangement

題意:

給定字元’a’出現的概率pa/(pa+pb),’b’出現的概率pb/(pa+pb);
給定一個正整數k,構造一個字串,當出現至少k個子序列”ab”時停止構造;
問子序列”ab”出現次數的期望P/Q,輸出P*(Q的逆元);
注意是子序列不是子串ab。

分析:

這個題特別難想!
一個 (dp+費馬小定理+數學+思維) 題;
由費馬小定理得,a在模mod下的逆元是a^(mod-2);
令pa+pb的逆元是inv;
令 f[i][j] 表示 i 個a,j個ab 時候的概率;
那麼容易得到

f[i+1][j] = f[i][j] * pa * inv;(在後面放一個a)
f[i
][i+j] = f[i][j] * pb *inv;(在後面放一個b)

但是,注意到這個串有可能無限長;
那麼,我們考慮i+j>=k的情況,
在這種情況下,只要後面再出現一個b,我們立刻就可以停止,
當後面出現:

(這裡暫且用pb表示b出現的概率,不考慮inv)
0個a,1個b:得到i+j個ab,答案加(i+j)*f[i][j]*pb;
1個a,1個b:得到i+j+1個ab,答案加(i+j+1)*f[i][j]*pa*pb;
2個a,1個b:得到i+j+2個ab,答案加(i+j+2)*f[i][j]*(pa^2)*pb;
3個a,1個b:得到i+j+3個ab,答案加(i+j+2)*f[i][j]*
(pa^3)*pb; ... n個a,1個b:得到i+j+n個ab,答案加(i+j+n)*f[i][j]*(pa^n)*pb; 彙總一下,答案加上f[i][j]*pb*∑(i+j+n)*(pa^n) (這個有人說可以用無窮級數求和,但是我還沒學到,這裡用等差*等比數列求和算,再寫一個式子相減即可) f[i][j]*pb* ∑(i+j+n)*(pa^n) =f[i][j]*pb* [i+j+pa*(1-pa^n)/pb]/pb =f[i][j]*[i+j+pa*(1-pa^n)/pb] →f[i][j]*[i+j+pa/pb] 即f[i][j]*[i+j+pa*inv(pb)]

總結:

這種dp不輸出特定的某一個dp值(如f[n]),而是在dp過程中統計答案;
注意用費馬小定理+快速冪求逆元的方法;
注意dp的隱含邊界條件,以及如何用極限處理無限長度的問題。

程式碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Tmax=1005;
const ll MOD=1e9+7;
int k;
ll pa,pb,f[Tmax][Tmax],ans,inv; //f[i][j] i ge a , j ge ab
ll quickpower(ll base,ll m)
{
    ll ret=1;
    while(m>0)
    {
        if((m&1)==1)
          ret=ret*base%MOD;
        base=base*base%MOD;
        m>>=1;
    }
    return ret;
}
int main()
{
    int i,j;
    cin>>k>>pa>>pb;
    inv=quickpower(pa+pb,MOD-2);
    f[1][0]=1;
    for(i=1;i<=k;i++)
      for(j=0;j<=k;j++)
      {
         if(i+j>=k)
            ans=(ans+f[i][j]*(i+j+pa*quickpower(pb,MOD-2)%MOD)%MOD)%MOD;
         else
         {
            f[i+1][j]=(f[i+1][j]+f[i][j]*pa%MOD*inv%MOD)%MOD;
            f[i][j+i]=(f[i][j+i]+f[i][j]*pb%MOD*inv%MOD)%MOD;
         }
      }
    cout<<ans;
    return 0;
}

最後請允許蒟蒻慶祝一波攻克這個題
這裡寫圖片描述

相關推薦

Codeforces 908D New Year and Arbitrary Arrangement(概率DP,邊界條件處理)

sin color 一個 pan ++ urn fin [1] bsp 題目鏈接 Goodbye 2017 Problem D 題意 一個字符串開始,每次有$\frac{pa}{pa+pb}$的概率在後面加一個a,$\frac{pb}{pa+pb}$的概率在後面加一個

Codeforces 908D New Year and Arbitrary Arrangement

題意: 給定字元’a’出現的概率pa/(pa+pb),’b’出現的概率pb/(pa+pb); 給定一個正整數k,構造一個字串,當出現至少k個子序列”ab”時停止構造; 問子序列”ab”出現次數的期望P/Q,輸出P*(Q的逆元); 注意是子序列不是子串

Codeforces 908 D New Year and Arbitrary Arrangement

ble other have span pri res ould com rmi Discription You are given three integers k, pa and pb. You will construct a sequence with the fo

CF 908 D New Year and Arbitrary Arrangement —— 期望DP

std con iostream algo print \n problem 就會 algorithm 題目:http://codeforces.com/contest/908/problem/D 首先,設 f[i][j] 表示有 i 個 a,j 個 ab 組合的期望,A

【CodeForces908D】New Year and Arbitrary Arrangement (期望DP)

題目大意 有一個ab字串,初始為空。 用PaPa+Pb的概率在末尾新增字母a,有 PbPa+Pb的概率在末尾新增字母b,當出現≥k個ab子串時立即停止新增字母,求最後期望的ab子串個數。(子串ab不要求連續) 例子:當k=1,aab含2個ab,bbabba

Codeforces 611D.New Year and Ancient Prophecy (dp + lcp)

ack com names getchar turn 一個數 長度 getc targe 題目鏈接: http://codeforces.com/problemset/problem/611/D 題意: 長為n的只有數字組成的字符串(n<=5000),問能分割成多少組

[Codeforces 750E]New Year and Old Subsequence

ons lin def aws swa rip 我們 can space Description 題庫鏈接 給出一個長度為 \(n\) 的僅包含數字的字符串。 \(q\) 次詢問,每次詢問該串 \([a,b]\) 段內刪去幾個數能夠使其不含 \(2016\) 的子串,但存在

codeforces 750A New Year and Hurry

題目描述:   Limak is going to participate in a contest on the last day of the 2016. The contest will start at 20:00 and will last four hours, e

codeforces 908A new year and counting cards

這題看著真TM嚇人,其實很假 只要讀懂題,都會做 題意: 如果一個字元是母音字母,則它對應的數字必為0,2,4,6,8(偶數)中的一個,否則為false。就是如果是母音字母,則要判斷,如果是奇數也要判斷(因為如果它的對應字元為母音,那麼則為false)如果是偶數或非子音字母則不用判斷。要保證

Codeforces 1091D New Year and the Permutation Concatenation 找規律,數學 B

Codeforces 1091D New Year and the Permutation Concatenation    https://codeforces.com/contest/1091/problem/D 題目:     Let n be an integer. C

Codeforces 1091E. New Year and the Acquaintance Estimation 二分+結論

題解: 第一次做這種……題面放個連結讓你自己去看題解的題目…… 連結告訴你的是一個非常有用的結論: 對於從大到小排好序的一些度數 d d

Codeforces-Good Bye 2017 B. New Year and Buggy Bot(模擬)

Describe Bob programmed a robot to navigate through a 2d maze. The maze has some obstacles.

Codeforces Good Bye 2018 D (1091D) New Year and the Permutation Concatenation

題意:給n!個n的排列,按字典序從小到大連成一條序列,例如3的情況為:[1,2,3, 1,3,2, 2,1,3 ,2,3,1 ,3,1,2 ,3,2,1],問其中長度為n,且和為sum=n*(n+1)/2的序列有多少個? 思路(官方題解):我們考慮一下nex

codeforces goodbye 2018 C. New Year and the Sphere Transmission D. New Year and the Permutation Concatenation

這兩題都是打表找的規律,C題發現具有相同最大因子的數字所走的點是一樣的,D題發現排列數和開頭有幾個相同的數字有關,所以用排列數公式算出有幾個這樣的開頭再乘上這種開頭的種類數就可以了 C題 #include<bits/stdc++.h> using namespace std; typed

codeforces#1090 D. New Year and the Permutation Concatenation(打表找規律)

.com 長度 clear name 分享圖片 ++ 全排列 找到 true 題意:給出一個n,生成n的所有全排列,將他們按順序前後拼接在一起組成一個新的序列,問有多少個長度為n的連續的子序列和為(n+1)*n/2 題解:由於只有一個輸入,第一感覺就是打表找規律,雖然表打出

Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 貪心 記憶化搜索 multiset取最大項

find 去掉 close 分享 搜索 data- 技術分享 ace using 題目大意: 給定n m k;(1≤n≤1e5, 0≤m≤200, 1≤k≤1e5) 表示n個時間長度內 最多被打擾m次 k個紅包 接下來k行描述紅包 s t d w;(1≤s≤t≤d≤n ,

Codeforces 536F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩陣乘法

離散對數 log new 考題 block memset ons ORC tps 我詐屍啦! 高三退役選手好不容易拋棄天利和金考卷打場CF,結果打得和shi一樣……還因為queue太長而unrated了!一個學期不敲代碼實在是忘幹凈了…… 沒分該沒分,考題還是要訂正的 =

Codeforces 1106B】Lunar New Year and Food Ordering

font pair this else force arr except .com rabl 【鏈接】 我是鏈接,點我呀:) 【題意】 給你n個菜以及每個人需要的菜以及數量 如果某個人無法滿足它對菜的需求的話 就用價格比較低的菜來填充它的要求。 (如果價格低的菜不

Codeforces 1106F Lunar New Year and a Recursive Sequence (數學、線性代數、線性遞推、數論、BSGS、擴展歐幾裏得算法)

recursive ati 滿足 name cstring rec 其中 lun 小時 哎呀大水題。。我寫了一個多小時。。好沒救啊。。 數論板子X合一? 註意: 本文中變量名稱區分大小寫。 題意: 給一個\(n\)階遞推序列\(f_k=\prod^{n}_{i=1} f_{

Codeforces problem 750E New Year and Old Subsequence

  我們的目標是得到含有’2017’而不含有’2016’的子序列,有多次查詢,用線段樹解決。線上段樹的每個節點中,開一個5*5的二維陣列arr[i][j],表示該區間為了能夠出現’2017’中的[i,j)子序列而不會出現[i,j]子序列,並且不會出現’201