狀態設計:成環使首尾相連
為何連成環?
單純鏈式地跑,狀態是無限的。
但是因為狀態是首位相接的,所以可以連成環,在環上可以無限地跑
最終狀態是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)view code#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;
*/
題解:對於一般情況,不同種類的卡之間概率不等,不再等價,但是抽到每種顏
色的概率都相等,所以對於每種卡來說不同顏色之間是等價的,只需記錄每種
顏色當前已經抽出了多少張卡(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 卡。反之則會猜測 ...