2017.8.29 達哥的隨單題...
隨
給出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 達哥的隨單題...