<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、題目描述

        有 $n$ 個人,第 $i$ 個人一開始有 $a_i$ 個球。每個人都有一個自己的傳球目標。

        有一個正整數 $k$,從 $1\sim k$ 中隨機選擇一個數作為游戲的進行輪數。

        在游戲的每一輪,所有人同時都把自己手上的球全部傳給自己的傳球目標。

        求游戲結束之后,每個人手上的期望球的數量。答案對 $998244353$ 取模,保證有逆元存在。

        數據范圍:$1\le n\le 2\times 10^5,1\le k\le 1\times 10^{18}$。


       二、解題思路:

        首先我們發現這個期望可以轉化為求和,最后乘上 $k$ 的逆元。

        這類輪數很多的題有兩條路可以走(就我的認知而言):找規律 & 倍增

        這題的狀態顯然:$f_{i,j}$ 表示節點 $i$ 經過 $2^j$ 輪之后獲得的總貢獻。

        而轉移的過程大概是比較套路的,但是這是我第一次做這樣的題,所以還是分析一下:

        令 $fa_{i,j}$ 表示節點 $i$ 的 $2^j$ 級祖先,$son_{i,j}$ 表示節點 $i$ 的 $2^j$ 級兒子。

        畫個圖不難發現:$f_{i,j}=f_{i,j-1}+\sum f_{son_{i,j-1},j-1}$。這大概是很套路的,記下來就好。

        雖然統計自己的兒子不好統計,但是只要每個點向自己的 $2^{j-1}$ 級祖先累加貢獻就好了。

        現在考慮經過了 $2^j$ 輪之后,$f_{i,j}$ 如何變化。其實也就是后面 $2^j$ 輪的貢獻。

        顯然 $f'_{i,j}=f_{i,j+1}-f_{i,j}$ ,$f'_{i,j}=\sum f_{son_{i,j},j}$。

        于是單次貢獻也能 $O(n)$ 解決了,將 $k$ 二進制化,像快速冪一樣統計答案,時間復雜度 $O(nlog_2^k)$。


       三、完整代碼

       1 #include<iostream>
       2 #define N 200010
       3 #define ll long long
       4 #define mod 998244353
       5 #define rep(i,l,r) for(ll i=l;i<=r;i++)
       6 using namespace std;
       7 ll n,k,inv,fa[N],val[N],tp[N],ans[N];
       8 ll ksm(ll base,ll q){
       9     ll res=1;base%=mod;while(q){
      10         if(q&1) res*=base,res%=mod;
      11         base*=base;base%=mod;q>>=1;
      12     }return res;
      13 }
      14 void add(ll &a,ll b){
      15     a+=b; if(a>=mod) a-=mod;
      16 }
      17 int main(){
      18     ios::sync_with_stdio(false);
      19     cin.tie(0);cout.tie(0);
      20     cin>>n>>k; inv=ksm(k,mod-2);
      21     rep(i,1,n) cin>>fa[i];
      22     rep(i,1,n) cin>>val[i];
      23     rep(i,1,n) add(tp[fa[i]],val[i]);
      24     rep(i,1,n) val[i]=tp[i];
      25     while(k){
      26         if(k&1){
      27             rep(i,1,n) add(ans[i],val[i]);
      28             rep(i,1,n) tp[i]=0;
      29             rep(i,1,n) add(tp[fa[i]],val[i]);
      30             rep(i,1,n) val[i]=tp[i];
      31         }
      32         rep(i,1,n) tp[i]=0;
      33         rep(i,1,n) add(tp[fa[i]],val[i]);
      34         rep(i,1,n) add(val[i],tp[i]);
      35         rep(i,1,n) tp[i]=fa[fa[i]];
      36         rep(i,1,n) fa[i]=tp[i]; k>>=1;
      37     }
      38     rep(i,1,n) cout<<ans[i]*inv%mod<<" ";
      39     return 0;
      40 }

      四、寫題心得:

        有一些倍增的題一直沒時間寫博客,今天總結一下:

        $1、對于一個序列/圖,若每個元素的后繼不多于一個,那么就可以倍增 。=> Exp++!$

        $2、倍增可以正序也可以倒序,按情況選擇。主要是看數組怎么樣方便轉移。=> Exp++!$

      posted on 2023-09-05 19:25  trh0630  閱讀(23)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 免费看黄色片| 亚洲国产制服丝袜高清在线| 国产成人午夜一区二区三区 | 精品国产第一国产综合精品| 四虎库影成人在线播放 | 亚洲男人av香蕉爽爽爽爽| 国产无套内射又大又猛又粗又爽| 临澧县| 国内不卡的一区二区三区| 另类专区一区二区三区| 国产美女自卫慰黄网站| 日韩高清不卡免费一区二区| 成人免费在线播放av| 99精品人妻少妇一区| 新婚少妇无套内谢国语播放| 国产精品十八禁一区二区| 人妻中文字幕亚洲精品| 麻豆成人传媒一区二区| 国产av一区二区三区综合| 日日摸夜夜添夜夜添国产三级| 图片区小说区av区| 极品尤物被啪到呻吟喷水| 国产精品SM捆绑调教视频| 亚洲精品日韩在线观看| 久久久久久久一线毛片| 精品一日韩美女性夜视频| 思思99热精品在线| 国产美女在线观看大长腿| 国产不卡一区二区四区| 在线视频中文字幕二区| 免费看黄色亚洲一区久久| 2021av在线天堂网| 中年国产丰满熟女乱子正在播放| 狼色精品人妻在线视频| 亚洲岛国成人免费av| 云浮市| 石原莉奈日韩一区二区三区| 欧美一本大道香蕉综合视频| 阿鲁科尔沁旗| 在线精品自拍亚洲第一区| 亚洲精品久久久久久下一站|