校內模擬 2048

2022-05-05 21:09:11 字數 919 閱讀 5375

顯然\(2048\)一定是若干個\(2^k(0\leq k \leq 11)\)湊出來的,我們不妨先將不是\(2^k\)的數去掉;

然後考慮求出剩下的數中有多少個子序列能湊出\(2048\)

我們可以考慮\(dp\),\(f[i][j]\)表示前\(i\)個數湊\(j\)的方案數,揹包就可以,第一維可以滾動陣列乾掉

需要注意的一點是所有能湊出大於等於\(2048\)的數的序列都是合法序列,正確性是顯然的(因為構成序列的最大的數也不超過\(2048\),所有的數都是\(2^k\))

不要忘了還有被去掉的數,加上他們依然可以湊出\(2048\),所以答案是\(f[cnt][2048]*(2^)\)

#include#include#includeusing namespace std;

#define int long long

#define mod 998244353

#define n 1000010

int n,a[n],m[2050],cnt,f[2050];

inline int qpow(int x,int k)

return s;

}#undef int

int main()

#define int long long

f[0]=1;

for(int i=1;i<=cnt;i++)

printf("%lld\n",f[2048]*qpow(2,n-cnt)%mod);

return 0;

}

校內模擬 鎖

沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...

2019 10 03 校內模擬

內網傳送門 很明顯的乙個網路流。轉換一下題意,相當於求保留航線的最大值。所以我們把邊權取負跑最小費用流。有乙個坑點,就是我們只需要費用最小,不要求流量最大,所以不應該用最小費用最大流。有兩個解決辦法 用最小費用可行流。連 i,t,1,0 i,t,1,0 i,t,1 0 的邊,表示不選 i ii 連出...