CF891E,奇妙的計數題

2021-08-10 23:55:32 字數 758 閱讀 6463

題面傳送門

題解首先這道題麵裡的」res」,其實就是初始n個數的積與k次操作後的期望乘積之差。這個挺顯然的,然而我一開始就沒往這方面去想,反倒想出了什麼倒數和的期望,我好菜啊。

知道這個性質後,我想出了乙個o(

nk2)

的dp

然後就是題解裡的演算法,最後居然是o(

n2)

我仔細看了一下,感覺題解這麼優越,是因為不必列舉每個數減了記下,dp時每次在k這一維上的偏移量都是1,是常量,比我少乙個k。同時題解裡又發現dp的過程實質上就是在n維空間(每一維大小都是2)裡行走的方案數,所以可以使用組合數,又比我少乙個k,挺奇妙的。

好像有人說這很簡單?看來還是我太弱了。

#include

const int n=5005,mo=1000000007;

int n,k,f[n][n],i,j,a,ans,inv[n],l;

inline int pow(int a,int b)

inline int p(int a,int b)

int main()

for(i=j=1,l=inv[n];i<=n && i<=k;++i,j=-j,l=1ll*l

*inv[n]%mo)

ans=(ans+mo+1ll*j

*p(k,i)*l

%mo*f[n][n-i]%mo)%mo;

printf("%d\n",ans);

return

0;}

CF891E Lust 生成函式

題意 給你乙個長度為n的序列 a i 對這個序列進行k次操作,每次隨機選擇乙個1到n的數x,令 res prod limits a i 一開始res 0 然後 a i 問最終res的期望值。答案在模意義下對 10 9 7 取模。n le 5000,k le 10 9 題解 首先需要發現,假如第i個數...

CF刷題總結 CF706E鍊錶

這題目應該要秒做出來的。首先看到二維,又沒什麼思路就直接降維 考慮一維的情況,就是一段連續的和另一端連續的交換,最快的當然是鍊錶模擬了。所以考慮到二維中也不應該用陣列儲存,而是鍊錶表示。但是由於二維的話,不可能是簡單的鍊錶。所以考慮每乙個矩形和旁邊的關係。肯定就是四周的,但是只考慮單向,那就是2個方...

CF508E 貪心 搜尋 構造

題目大意 讓你構造乙個括號序列,括號匹配的方式類似於棧,給出從左數每個括號 到和它匹配的右括號的 最小和最大距離,讓你輸出乙個合法括號序列 看錯題了以為是二分圖,然後寫了搜尋 貪心發現如果距離往小了填,不會影響結果 括號必須套完整的括號,所以距離必須是2的整數倍 1 如果乙個括號匹配上了,那麼兩個括...