日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[2020-09-11 CQBZ/HSZX多校联测 T2] 泰拳警告(组合数+数学期望)

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [2020-09-11 CQBZ/HSZX多校联测 T2] 泰拳警告(组合数+数学期望) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

泰拳警告

  • description
  • solution
  • code

description

題目描述
小七擅長泰拳,某天他打算與小棗切磋拳技,一共需要進行 n 次比賽。
由于雙方拳技難分上下,每場比賽小七獲勝或落敗的概率都是 1/p+2 ,平局的概率是 p/p+2
若最后小七獲勝場數大于落敗場次,且平局次數為 k ,則能獲得 k + 1 獎勵分
小七想知道,他能獲得的獎勵分的期望是多少呢?為了避免精度誤差,你需要輸出答案在模 998244353 意義下的結果

輸入格式
輸入文件 fight.in 包含一行,輸入兩個正整數依次表示 n; p
輸出格式
輸出文件 fight.out 包含一行,僅一個非負整數,表示答案在模 998244353 意義下的結果

樣例輸入
2 1
樣例輸出
221832079

樣例解釋
兩局都勝,或勝一局平一局是合法的,期望得分為 1/3 × 1/3 ×1+2× 1/3 × 1/3 ×2 = 5/9,在模 998244353 意義下為 221832079

數據范圍及約定

測試點編號n特殊性質
1 ~ 4≤ 2000
5 ~ 8≤ 105
9 ~ 12≤ 3 × 106p = 1
13 ~ 20≤ 3 × 106

對于 100% 的數據,滿足 1 ≤ n ≤ 3 × 106; 1 ≤ p < 998244351 。可以證明答案一定能表示成一個既約分數 u/v,你需要找到滿足 v × w ≡ 1 mod 998244353的自然數 w ,輸出 u × w mod 998244353

solution

case 0 : 上來直接搞大DPDPDPdpi,j:dp_{i,j}:dpi,j?: 贏了iii場,輸了jjj場的概率,自然就平了n?i?jn-i-jn?i?j

枚舉每一場是贏了還是輸了甚至于平了,這是O(n3)O(n^3)O(n3)的,連最基礎的測試點都不能拿到

case 1~4 :猜測改寫dpi,j:dp_{i,j}:dpi,j?: 在第iii輪為止平了jjj的概率,將勝場和負場合并在一起

dpi,j?1p+2?2→dpi+1,jdp_{i,j}*\frac{1}{p+2}*2\rightarrow dp_{i+1,j}dpi,j??p+21??2dpi+1,j?

dpi,j?pp+2→dpi+1,j+1dp_{i,j}*\frac{p}{p+2}\rightarrow dp_{i+1,j+1}dpi,j??p+2p?dpi+1,j+1?

最后平了kkk場的方案數,如果勝了iii,負了jjj;則一定對應有一種勝了jjj,負了iii,看似/2/2/2就行了,總是恰好有一種勝場大于負場

但是如果i=j,就都不能取,單獨減掉

case 5~8 : n≤105n\le 10^5n105,沒有特殊性質,應該是拿來給選手被卡log的安慰

case 9~12 : p=1p=1p=1,意味著勝負平都是一樣的概率,應該可以利用數學方法計算

case 13~20 :最后就是正解了,私以為還是p=1的數據提供了可以數學計算的靈感

枚舉平了kkk場,因為勝負的概率一樣,所以平了kkk場的每種情況概率都是一樣的

(pp+2)k?(1p+2)n?k(\frac{p}{p+2})^k·(\frac{1}{p+2})^{n-k}(p+2p?)k?(p+21?)n?k

每種可能其實相當于在nnn個位置中,選kkk個為止為平,選iii個位置為勝,剩下自然就是負

C(n,k)?C(n?k,i)C(n,k)*C(n-k,i)C(n,k)?C(n?k,i)

這里一旦枚舉iii就又變成n2n^2n2

考慮iii的限制,勝場大于負場,即i>n?k?i?i∈(n?k2,n?k]i>n-k-i\Rightarrow i\in(\frac{n-k}{2},n-k]i>n?k?i?i(2n?k?,n?k]

隨著kkk的枚舉,計算的iii范圍也要變化,C(n?k,i)C(n-k,i)C(n?k,i)似乎不能通過求和然后乘以一個分數轉移到下一個kkk,也就省不掉

考試時,在這里我陷入了僵局

思索許久無果后,我想起了與組合系數緊密相連的楊輝三角

iii的范圍對應在上面是一段后綴區間,斜著的不對齊,不能直觀沖擊我的數學左腦

于是乎,我果斷選擇枚舉負場次數i

這樣在楊輝三角里面就是一段左對齊的區間選址

/0123456
01202^020
111212^121
2121222^222
31331232^323
414641242^424
515101051252^525
61615201561262^626

楊輝三角有太多的性質了

  • iii行的和為2i2^i2i
  • 每一行是對稱的

這兩個性質便是去掉一個nnn復雜度的關鍵

因為負場是不到一半的

e.g. 勝負場666,負場可能為0/1/20/1/20/1/2,在楊輝三角中就是減去1+6+151+6+151+6+15

這等于先減去中間的C(i,i2)C(i,\frac{i}{2})C(i,2i?),再除以二

e.g.勝負場555,負場可能為0/1/20/1/20/1/2,直接減去Z總和的一半

所以說負場iii的貢獻可以根據n?kn-kn?k的奇偶直接算

這中間設計逆元,冪等,需要預處理后O(1)O(1)O(1)調用

卡的就是懶人非要在計算時反復算快速冪的log?\loglog

code

#include <cstdio> #define mod 998244353 #define int long long #define maxn 3000005 int n, p; int fac[maxn], inv[maxn], mi_2[maxn], Inv[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void init() {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ )fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- )inv[i] = inv[i + 1] * ( i + 1 ) % mod;mi_2[0] = Inv[0] = 1; int mi = 1;for( int i = 1;i <= n;i ++ ) {mi_2[i] = mi_2[i - 1] * 2 % mod;mi = mi * ( p + 2 ) % mod;}Inv[n] = qkpow( mi, mod - 2 );for( int i = n - 1;i;i -- )Inv[i] = Inv[i + 1] * ( p + 2 ) % mod; }int C( int n, int m ) {return fac[n] * inv[m] % mod * inv[n - m] % mod; }signed main() {freopen( "fight.in", "r", stdin );freopen( "fight.out", "w", stdout );scanf( "%lld %lld", &n, &p );init();int ans = 0, Inv2 = qkpow( 2, mod - 2 ), mi_p = 1;for( int i = 0;i < n;i ++ ) { //平i場 int t = mi_p * Inv[i] % mod * Inv[n - i] % mod * C( n, i ) % mod;int k; //枚舉負場 if( ( n - i ) & 1 ) //勝場+負場=奇數 n-ik = mi_2[n - i - 1];elsek = ( mi_2[n - i] - C( n - i, ( n - i ) >> 1 ) + mod ) % mod * Inv2 % mod;ans = ( ans + k * t % mod * ( i + 1 ) ) % mod;mi_p = mi_p * p % mod;}printf( "%lld\n", ans );return 0; }

總結

以上是生活随笔為你收集整理的[2020-09-11 CQBZ/HSZX多校联测 T2] 泰拳警告(组合数+数学期望)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。