測試35 抽卡

2022-03-16 14:34:39 字數 3128 閱讀 9224

狀態設計:成環使首尾相連

為何連成環?

單純鏈式地跑,狀態是無限的。

但是因為狀態是首位相接的,所以可以連成環,在環上可以無限地跑

最終狀態是f(0,m),而不是f(0,0).(0,m)沒開始,(0,0)已開始。

處理環:1、高斯消元。但是是取模意義下的,而且複雜度太大會t

2、係數遞推。相當於手動高斯了。因為to(i,j)一定比當前多,可以先處理出來,就成了常量。

而環的問題可以寫出a*f0+b=fm,fm=f0+1;手動解。

可行性在於每個狀態轉移來的未知量只有乙個。

to(i,j)函式:s+(1<>x)+1)<

#include#define f(i,a,b) for(rg int i=a;i<=b;++i)

#define rg register

#define ll long long

#define il inline

#define pf(a) printf("%lld ",a)

#define phn puts("")

using

namespace

std;

#define int ll

intread();

/*狀態設計:成環使首尾相連

為何連成環?

單純鏈式地跑,狀態是無限的。

但是因為狀態是首位相接的,所以可以連成環,在環上可以無限地跑

最終狀態是f(0,m),而不是f(0,0).(0,m)沒開始,(0,0)已開始。

處理環:1、高斯消元。但是是取模意義下的,而且複雜度太大會t

2、係數遞推。相當於手動高斯了。因為to(i,j)一定比當前多,可以先處理出來,就成了常量。

而環的問題可以寫出a*f0+b=fm,fm=f0+1;手動解。

可行性在於每個狀態轉移來的未知量只有乙個。

to(i,j)函式:s+(1<>x)+1)

intn,m;

int p[30],q[30

];int f[420010][70

];const

int mod=2000000011,inv3=1333333341

;il

int qpow(int x,int k)

il int cal(int s,int

i)il

int to(int s,int

i)int a[70],b[70

];il

int mo(int x)

signed main()

for(rg int k=m-2;k>=0;--k)

b[k]=mo(a[k]*b[k+1]%mod+b[k]);

a[k]=a[k]*a[k+1]%mod;

}f[s][m]=(b[0]+1)*qpow((1ll-a[0]+mod)%mod,mod-2)%mod;

for(rg int k=m-1;k>=0;--k)

}//pf(f[6]);

printf("

%lld\n

",f[0

][m]);

}il

intread()

/*g++ 1.cpp -g

time ./a.out

1 127 74

2 184 84

54 54

1 127 74

*//*

int pc=q[0],s=1;

f(j,1,n)

f[i]=s*qpow((1ll-pc+mod)%mod,mod-2)%mod;

// pf(i);pf(f[i]);phn;

*/

view code

題解:對於一般情況,不同種類的卡之間概率不等,不再等價,但是抽到每種顏

色的概率都相等,所以對於每種卡來說不同顏色之間是等價的,只需記錄每種

顏色當前已經抽出了多少張卡(0 ∼ 3 張),於是可以用乙個 n 位的**制數來

記錄,狀態數為 4 n 。

記 f [s][k] 表示當前的**制數狀態為 s,本次氪金已經抽了 k 次,到結束

時的期望氪金次數。當 s 已經包含了所有顏色的所有種類的卡時,f [s][k] = 0;

否則,當 k = m 時,因為一次氪金抽卡的結束後是另一次氪金抽卡的開始,所

以 f [s][m] = f [s][0] + 1;否則,記 c(s, i) 表示狀態 s 中第 i 種卡片出現了多少

種顏色,則 k < m − 1 時(其中 t i 表示)((

))n∑

c(s, i)

c(s, i)

f [s][k] =

p if [s][k + 1] + 1 −

f [t i ][k + 1]33

i=1k = m − 1 時將 p i 換成 q i 即可。最後答案為 f [0][m](注意 f [0][0] 表示的是一

次氪金抽卡已經開始,f [0][m] 才表示還沒有開始)。因為 s 相同時轉移會成環,

即 f [s][k] 要用到 f [s][k + 1],而 f [s][m] 要用到 f [s][0],可以用高斯消元對這

m + 1 個變數解方程組,時間複雜度為 θ(4 n (mn + m 3 ))。

然後將 f [s][m − 1] 代入 f [s][m − 2],可以得到

f [s][m − 2] = c m−2 (a m−1 f [s][m] + b m−1 ) + d m−2

= c m−2 a m−1 f [s][m] + c m−2 b m−1 + d m−2

= a m−2 f [s][m − 1] + b m−2也即{

a m−2 = c m−2 a m−1

b m−2 = c m−2 b m−1 + d m−2

按 k 從大到小的順序,可以依次求出 a k , b k ,即將 f [s][k] 全部表示成 f [s][k] =

a k f [s][m] + b k 的形式,最後得到

f [s][0] = a 0 f [s][m] + b 0

而f [s][m] = f [s][0] + 1

聯立兩方程可以解出 f [s][m] 的值,然後再代入 f [s][k] = a k f [s][k] + b k 求出所

有 f [s][k]。這樣避免了高斯消元,時間複雜度為 θ(4 n mn)。

抽卡概率的測試

擷取了我最近寫的乙個文件。關於抽卡概率 1.先驗證策劃的概率是否有偽概率和用指令碼控制的,以下為例子 pro代表倍率,pro6最高 例子如下 idgold pro1 pro2 pro3 pro4 pro5 pro6 1 88000 020302 288000 030203 9880020 01554...

貪心 抽卡遊戲

微眾某道筆試題。貪心演算法。排個序就行 排序思路 貪心。把卡片上額外次數最多的卡片防在最前面,如果額外次數一樣多,那麼金額大的放在前面。collections.sort list,e1,e2 e1.exchance e2.exchance e2.exchance e1.exchance e2.mon...

抽卡遊戲 2021 1 12

本題的靈感 於乙個古典的概率模型。alice 在乙個卡池裡抽卡,裡面有 x 張 s 卡和 y 張 a 卡。alice 每次會不放回的隨機從卡池中抽出一張卡。bob 在一旁看 alice 抽卡並對每次的結果進行 若卡池裡 s 卡的數量多於 a 卡,bob 會猜 alice 抽出 s 卡。反之則會猜測 ...