題解 2019,4 20模擬賽 (白鼠)

2022-06-20 06:12:11 字數 1255 閱讀 8594

\(description:\)

給出一塊巧克力,橫著可以切 \(h\) 刀,豎著可以切 \(w\) 刀,橫著切了 \(i\) ,豎著切了 \(j\) 可以得到 \((i+1)*(j+1)\) 塊巧克力,每次切得代價是巧克力塊數,求切 \(k\) 的期望代價,每次在剩餘能切的位置等概率選乙個切,答案對 \(10^9+7\) 取模。

\(sample\)

\(input:\)

2 1 2

\(sample\)

\(output:\)

$solution: $

一開始考試的時候沒啥子想法,瞎寫了乙個dp ,狀態定的不錯,只可惜忘記了他每次的概率也會變換,是要順便在記乙個概率的。。。

正解有一種dp,跟我想法差不多:

記 \(f[i][j]\) 表示總共切了 \(i\) 刀,橫著切了 \(j\) 刀的概率

再記乙個 \(g[i][j]\) 表示總共切 $ i $ 刀,橫著切了 \(j\) 刀的期望。

直接暴力處理出兩個陣列,乙個是總方案數,另乙個記總代價。

最後兩者直接除一除。

注意逆元和切得位置不同,切得順序不同都算不同方案。

我只寫了第二種方法,**短,好理解。

#include#include#define int long long

using namespace std;

int h,w,k,ans,sum;

const int n=5000+5,p=1e9+7;

int f[n][n],g[n][n];

inline int power(int a,int b)

return ret;

}signed main()

for(int j=1;j<=min(w,k);++j)

for(int i=1;i<=min(h,k);++i) for(int j=1;j<=min(w,k-i);++j)

for(int i=0;i<=h;++i) if(k-i<=w)

ans=(ans+f[i][k-i])%p,sum=(sum+g[i][k-i])%p;

printf("%lld\n",ans*power(sum,p-2)%p);

return 0;

}

學校初一模擬賽(2019 4 20)

rank name score t1t2 t3t41lyf lyfly f400 100100 1001002wjj wjjwj j310 100100 100103hky hkyhk y300 100100 10004cyz cyzcy z300 100100 10005fyfy fy300100...

2019 4 20南昌網路賽

2019.4.20南昌網路賽總結 一開始是a題,自數卡了一會,算出了自數,但是輸出的時候一開始是通過 將數連在一起輸出,wa了,後面換成了換行輸出,才過了。再之後看的是第m題,小組討論了蠻久,後面一直超時,超了一點。感覺演算法也沒什麼可以改進的了。後面隊友把cin換成了scanf,終於過了。然後隊友...

模擬賽 circle 題解

題意 有n個數,問有多少個x,x leq t 滿足這n個數分別 x後,異或和為s。每個數小於 2 m 數字dp。由於是加法,需要記錄進製,因此從低位到高位dp。只要記錄下有幾個進製,就可以根據這n的數的大小知道究竟是哪幾個進製了。設 dp i,j,0 1 表示考慮到第i位,有j個進製,與t的大小關係...