bzoj1799同類分布 數字DP

2022-05-12 12:58:08 字數 1038 閱讀 8432

題目:

數字dp。

1、迴圈方法

預處理出每個位數上,和為某個數,模某個數餘某個數的所有情況;

因為開四維會爆空間,所以省去模數,為此需要固定模數一次一次累加;

餘數的轉移,以及可以填數的範圍都值得注意。

**如下:

#include#include

#include

using

namespace

std;

typedef

long

long

ll;ll l,r,mul[

22],f[22][205][205

],ans,sx;

int a[3][22],w[3

];void cl(int

t,ll tmp)

}void

pw()

void pre(ints)}

ll cal(

int t,int

s)

return

cnt;

}int

main()

printf(

"%lld

",ans);

return0;

}

2、遞迴方法

記憶化,**極簡單,詳見注釋。

**如下:

#include#include

using

namespace

std;

typedef

long

long

ll;int a[25

],mod,cnt,tot;

ll f[

3][25][205][205],vis[3][25][205][205],x,y;//

tot時間戳

ll dp(int p,int d,int s,int v)//

p為有無限制,d為第幾位,s為位數和,v為模餘數

ll solve(ll x)

intmain()

BZOJ 1799 同類分布 數字DP

給出a,b,求出 a,b 中各位數字之和能整除原數的數的個數。1 a b 1e18.注意到各位數字之和最大是153.考慮列舉這個東西。那麼需要統計的是 0,a 1 和 0,b 內各位數字之和為x且能整除x的數字個數。那麼我們只需要數字dp一波即可。令dp pos i x 表示有pos位且數字之和為x...

BZOJ 1799 self 同類分布

給出a,b,求出 a,b 中各位數字之和能整除原數的數的個數。10 19 約束條件 1 a b 10 18 思路 數字dp,dp i j k 的i表示第i位,j表示當前餘數,k表示第i位之前的每一位數字的和。for int i 1 i pos 9 i 中的pos 9是每一位數字的和的最大值。incl...

BZOJ 1799 self 同類分布

bzoj 1799 傳送門 一句話的題目,看得爽,做得煩 一般這類和數字相關的都是數字 dp 吧 不過一開始還是感覺不太可做,畢竟每個數模數不同 但要發現,模數最高也只可能為 9 19 171 於是只要將數按照他們的數字和 即模數 分類計算即可 這樣便暴力解決了模數不同的問題 設 dp sp sum...