1. 程式人生 > >2017.8.29 達哥的隨單題...

2017.8.29 達哥的隨單題...

關系 個數 矩陣乘法 -s 乘法 開始 期望 位置 str

給出n個正整數a1,a2…an和一個質數mod.一個變量x初始為1.進行m次操作.每次在n個數中隨機選一個ai,然後x=x*ai%mod.問m次操作之後x的取值的期望.

答案一定可以表示成a/b的精確分數形式.a和b可能很大,所以只需要輸出a*(b^(10^9+5))模10^9+7的結果.

n<=10^5 m<=10^9 mod<=10^3 1<=ai<mod

solution

考試時明白了原根是什麽,只可惜我就是腦子抽風,不會dp...

80分:

定義 f[i][j] 表示乘到第i次,x=j的概率 (當然概率是%1e9意義下的概率)

由於m很大,而狀態轉移可以寫成矩陣乘的形式,所以可以用矩陣乘法優化到O(mod^3*logm)

100分:

O(n^2)求出mod的原根(原根rt:rt的1次方,2次方,...,mod-1次方可以取到1~mod-1的所有數)

所有的ai都可以用rt^k表示

所以這時 f[i][j] 表示乘到第i次,rt^j的概率,然後矩陣乘把狀態矩陣輸出,發現是循環矩陣

之後就優化到了O(n^2*logm)

給一個n個點的樹,有n-1條邊,每一個點有一個權值,定義a[i]為i這個點的權值,定義dis(i,j)為i到j的樹上距離,dis(i,i)=0

定義b[i]=∑a[j]*dis(i,j)

有兩種情況:

1.給定a[i],求出b[i]

2.給定b[i],求出a[i]

solution

對於樹上的一對fa和son,我們發現b[fa]和b[son]的差別只是由於他倆之間的邊做出貢獻

定義 sum為整棵樹的取值之和 pre[i]=sum-val[i](以i為根的子樹權值和) suf[i]=val[i]

而 pre[i]和suf[i] 都是可以通過一遍O(n)的dfs求出

那麽得到n-1個關系 b[fa]-b[son]=-pre[fa]+suf[son]

第一種情況:

由b[fa]可以推到b[son] 即

b[son]=b[fa]+pre[fa]-suf[fa]

所以先dfs一遍求出b[root]

再遞推即可

第二種情況:

b[fa]-b[son]=-pre[fa]+suf[son]+ sum=pre[fa]+suf[son]

b[fa]-b[son]=2*suf[son]-sum

把n-1個關系相加得

temp=2*(∑suf[k](1<=k<=n,k!=root))-(n-1)*sum的值

得到的n-1個關系 只是a[i]之間的關系,與它們的具體取值無關

而 b[root]=∑suf[k](1<=k<=n,k!=root)

(temp+b[root]*2)/(n-1)=sum

求出來sum再回代即可求出suf[i],最後差分求出a[i]

你在平面直角坐標系上.

你一開始位於(0,0).

每次可以在上/下/左/右四個方向中選一個走一步.

即:從(x,y)走到(x,y+1),(x,y-1),(x-1,y),(x+1,y)四個位置中的其中一個.

允許你走的步數已經確定為n.現在你想走n步之後回到(0,0).但這太簡單了.你希望知道有多少種不同的方案能夠使你在n步之後回到(0,0).當且僅當兩種方案至少有一步走的方向不同,這兩種方案被認為是不同的.

答案可能很大所以只需要輸出答案對10^9+7取模後的結果.(10^9+7=1000000007,1和7之間有8個0)

這還是太簡單了,所以你給能夠到達的格點加上了一些限制.一共有三種限制,加上沒有限制的情況,一共有四種情況,用0,1,2,3標號:

0.沒有任何限制,可以到達坐標系上所有的點,即能到達的點集為{(x,y)|x,y為整數}

1.只允許到達x軸非負半軸上的點.即能到達的點集為{(x,y)|x為非負數,y=0}

2.只允許到達坐標軸上的點.即能到達的點集為{(x,y)|x=0或y=0}

3.只允許到達x軸非負半軸上的點,y軸非負半軸上的點以及第1象限的點.即能到達的點集為{(x,y)|x>=0,y>=0}

typ=2,n<=1000 typ=3,n<=100000 typ=1,n<=100000 typ=0,n<=100000

solution

tpy=

2017.8.29 達哥的隨單題...