CF 55D數字dp 狀壓

2022-09-23 11:36:12 字數 993 閱讀 6061

cf-55d數字dp+狀壓:求出區間[l,r]中的所有beautiful number的數目,如果乙個數x可以被它各個數字上的非零數整除,那它就是beautiful number。

很巧妙的一道數字dp,沒想出來看題解了。

假設不考慮記憶化搜尋,這裡可以直接列舉每一位的值來進行計算,這裡可以進行狀壓,利用cnt(1<<8)來儲存出現過的位數,每次列舉到pos==-1的時候,就可以判斷這個數是否可以被所有出現過的數字整除。

這裡有個很關鍵的一點,需要知道如果z%y==0,那麼(x%z)%y==x%y,明白這一點後,發現這裡一共需要判斷的只有數字上出現2到9這些數,而2到9的最小公倍數是2520,也就是說,對於beautiful number,(x%2520)%y==x%y,由此可以想到,我們只要儲存x%2520的值就可以了。

這樣設計狀態dp[pos][cnt][sum]表示pos位且出現的數字狀態為cnt且當前數字和是sum的合法數的數目,進行記憶化搜尋。

#include

using namespace std;

typedef long long ll;

ll dp[20][(1 << 8) + 10][3000];

int a[20];

ll dfs(int pos, int cnt, int sum, int limit)

if (!limit && dp[pos][cnt][sum] != -1) return dp[pos][cnt][sum];

int up = limit ? a[pos] : 9;

ll res = 0;

for (int i = 0; i <= up; i++)

if (!limit) dp[pos][cnt][sum] = res;

return res;

}ll solve(ll x)

return dfs(pos - 1, 0, 0, true);

}int main()

return 0;

}  

CF678E(狀壓DP 期望)

4648.noip2016提高a組模擬7.17 錦標賽 problem n nn個人進行n 1 n 1n 1輪淘汰賽。已知i ii戰勝j jj勝率為ai,ja ai,j 求乙個排列使得1 11獲勝概率最大.n 18 n le 18 n 18 solution 首先考慮乙個暴力做法 如果已經知道了排列...

CF 449D 題解(狀壓 容斥)

狀壓妙啊.本題的主體思路 狀壓 容斥原理 或狀壓 數字dp 記g i 表示按位與後結果所有位上至少有i個1的方案數 那麼根據容斥原理,ans g 0 g 1 g 2 g 3 g 4 於是如果我們求出了g,就可以求出ans 可是怎麼求出g呢 我們記f i 表示a i i這樣的a的個數,那麼如果i某一位...

Codeforces 1073E 狀壓 數字dp

題意 輸入l r k,輸出區間 l,r 內數字種數不超過k的數字之和,比如l 10,r 50,k 1,答案就是11 22 33 44 110 1 l 1e18,1 e 1e18,1 k 9 思路比較明顯的數字dp,因為要考慮當前所用的數字種類所以要把用過的數字狀壓一下,用dp i s 表示從低到高遞...