51nod 1850 抽卡大賽

2022-05-16 06:51:23 字數 1884 閱讀 2613

51nod為了活躍比賽前的氣氛,組織了場抽卡比賽。這場比賽共 n 個人參加,主辦方根據非歐血統鑑定器,得到了一些資料。每個人抽卡有 mi 種可能,得到的卡能力值為 aij 代價為 gij 的可能性為 pij ,所謂代價指的是玩家需要將一輪比賽後所得的點頭盾的 gij% 交給主辦方。每輪比賽每個人都隨機抽取卡片,待全部人抽取完畢後進行排名(按照a從大到小排),排在第 i 位的人有 vi 的點頭盾收入。現在主辦方想知道一輪比賽後每個人的期望收入。

第一行乙個正整數 n

接下來 n 個部分

每個部分第一行為正整數 mi,接下來 mi 行有三個整數 aij gij pij

接下來一行 n 個整數,分別為 vi

設 ∑pij=qi,則第 i 個人抽到第 j 張卡的概率為 pij/qi

1<=n,mi<=200,1<=aij<=1000000000,保證 aij 互不相同,0<=gij<=100,1<=pij<=1000,1<=vi<=1000

輸出 n 行,每行乙個數表示每個人的期望收入

為了防止精度誤差,輸出答案在模 1e9+7 意義下的數值22

3 50 5

4 50 5

25 50 5

6 50 5

2 21

1o(n^4)的做法比較好想。回想這個做法,可以發現最麻煩的一點是求每個人排名多少的概率。考慮優化這一過程。

假設當前考慮第\(i\)個人。設\(p_j\)表示第\(j\)個人排名比\(i\)靠前的概率,\(f[j]\)表示第\(i\)個人排名為j的概率。結合生成函式的知識,\(f\)數列的生成函式即為

\[\prod_p_j\times x+(1-p_j)

\]\(f[i]\)即對應上面多項式展開後的i-1次項。所以,我們將所有卡牌按照a從大到小排序,如果當前卡牌對應的人的排名要往後,就必須要在這張牌之前的牌中選一張。我們需要維護上面的多項式。具體的,設當前人為i,那麼\(p[j]\)就是j前面出現的所有卡牌的概率之和。由於多項式滿足\(i!=j\),我們要將當前的多項式除以\(p_i\times x+1-p_i\),然後乘上\(p_j\times x+1-p_j\)。手動模擬一下兩個多項式相乘的過程就可以解決這個問題了。

當然也可以ntt

#include #include #include #define int long long

#define n 202

using namespace std;

const int mod=1000000007;

struct carda[n*n];

int n,m[n],v[n],cnt,i,j,f[n],ans[n],p[n];

int read()

return w;

}int poww(int a,int b)

return ans;

}int my_comp(const card &x,const card &y)

signed main()

inv=poww(inv,mod-2);

for(j=1;j<=m[i];j++) a[cnt-j+1].p=a[cnt-j+1].p*inv%mod;

} for(i=1;i<=n;i++) v[i]=read();

sort(a+1,a+cnt+1,my_comp);

f[1]=1;

for(i=1;i<=cnt;i++)

for(j=1;j<=n;j++) ans[a[i].id]=(ans[a[i].id]+f[j]*v[j]%mod*a[i].p%mod*a[i].g%mod)%mod;

p[a[i].id]=(p[a[i].id]+a[i].p)%mod;

} for(i=1;i<=n;i++) printf("%lld\n",ans[i]);

return 0;

}

51nod 1850 抽卡大賽(動態DP?霧)

51nod為了活躍比賽前的氣氛,組織了場抽卡比賽。這場比賽共 n個人參加,主辦方根據非歐血統鑑定器,得到了一些資料。每個人抽卡有 mi 種可能,得到的卡能力值為 aij 代價為 gij 的可能性為 pij 所謂代價指的是玩家需要將一輪比賽後所得的點頭盾的 gij 交給主辦方。每輪比賽每個人都隨機抽取...

多項式 DP 省選模擬51nod抽卡大賽

的dp很容易能想到 定義d p i j k dp i j k dp i j k 表示第i個人選j時,有k個人比它小的概率 然後就能直接算期望了。不過這玩意顯然要t 發現,對於乙個已經固定的i,j,那麼剩下的所有人的所有情況本質上只有2種 比ai,ja ai,j 小,比ai,ja ai,j 大。那麼可...

51nod1702 卡牌遊戲

題目鏈結 最樸素的想法是將圖建出來跑最短路。觀察後發現如下兩條性質 1.邊權是1,可以用廣度優先搜尋代替最短路。2.因為是廣度優先搜尋,每條邊只會被鬆弛一次。但是圖的大小可能是n 2n 2 n2級別的。我們考慮使用線段樹維護隱式圖來支援搜尋。複雜度o n log2 n o nlog 2n o nlo...