\(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的大小關係...