小q的工作是採摘花園裡的蘋果。在花園中有n棵蘋果樹以及m條雙向道路,蘋果樹編號依次為1到n,每條道路的兩
端連線著兩棵不同的蘋果樹。假設第i棵蘋果樹連線著d_i條道路。小q將會按照以下方式去採摘蘋果:
1.小q隨機移動到一棵蘋果樹下,移動到第i棵蘋果樹下的概率為d_i/(2m),但不在此採摘。
2.等概率隨機選擇一條與當前蘋果樹相連的一條道路,移動到另一棵蘋果樹下。
3.假設當前位於第i棵蘋果樹下,則他會採摘a_i個蘋果,多次經過同一棵蘋果樹下會重複採摘。
4.重複第2和3步k次。
請寫乙個程式幫助計算小q期望摘到多少蘋果。
n,k<=100000,m<=200000
比賽的時候只想著如何優化暴力遞推,就沒有搞出來。
這題要注意到題目給出的特殊條件:移動到第i棵蘋果樹的概率是di
2m,假設有一條i到j的邊,那麼在第一步到達j的概率就要加上12
m 。因為要加dj
次,所以第1步到達j的概率就是dj
2m。同理可以得到每一步到達點j的概率其實就是dj
2m。
所以答案就是k∗
∑ni=
1di∗
ai2m
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int n=100005;
const int mod=1000000007;
int n,m,k,a[n],d[n];
intread()
while (ch>='0'&&ch<='9')
return
x*f;
}int ksm(int
x,int
y) return ans;
}int main()
int ans=0,ny=ksm(m
*2,mod-2);
for (int i=1;i<=n;i++) ans+=(ll)d[i]*ny
%mod
*a[i]%mod,ans-=ans>=mod?mod:0;
ans=(ll)ans*k
%mod;
printf("%d",ans);
return
0;}
hdu5091(掃瞄線 線段樹)
題意 給n個點,和長w寬h的矩形,問矩形最多能包含多少個點。思路 掃瞄線 線段樹,首先將座標轉化成非負數,對於每個點 x,y 標記為1,生成乙個 x w,y 的點,標記為 1,然後將y軸建立線段樹,維護乙個最大值即可。如不不明白的話,畫個圖,理解一下就好了。如下 include include in...
HDU 5091 線段樹掃瞄線
給出n個點。和乙個w h的矩形 給出n個點的座標,求該矩形最多能夠覆蓋多少個點 對每乙個點point x。y 右邊生成相應的點 x w,y 值為 1 縱向建立線段樹,從左到右掃瞄線掃一遍。遇到點則用該點的權值更新區間 y,y h include stdio.h include string.h in...
P5091 模板 尤拉定理
出題人也想寫有趣的題面,可惜並沒有能力。給你三個正整數,a,m,ba,m,b,你需要求 a b bmod mabmodm 一行三個整數,a,m,ba,m,b 乙個整數表示答案 輸入 1複製 2 7 4 輸出 1複製 2 輸入 2複製 998244353 12345 98765472103312450...