題目:
數字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#includeusing
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...