bzoj 1799 傳送門
一句話的題目,看得爽,做得煩
一般這類和數字相關的都是數字$dp$吧
不過一開始還是感覺不太可做,畢竟每個數模數不同
但要發現,模數最高也只可能為$9*19=171$,
於是只要將數按照他們的數字和(即模數)分類計算即可
這樣便暴力解決了模數不同的問題
設$dp[sp][sum][rmd][lmt]$表示:
列舉到第$sp$高位,剩下的數的和位$sum$,此時對$mod$餘$rmd$時的方案數(lmt表示是否達到上界)
感覺數字$dp$還是用記憶化搜尋寫起來邏輯比較清晰吧
#include usingnamespace
std;
typedef
long
long
ll;const
int maxn=175; //
n可能為19,sum最大為171
int vis[20][maxn][maxn][2],mod,dgt,cur,num[20
];ll a,b,dp[
20][maxn][maxn][2
];ll dfs(
int sp,int sum,int rmd,int
lmt)
ll solve(ll x)
intmain()
1、少用$memset$,盡量在使用時順便初始化
為了區分不同次的呼叫,可以在每一次呼叫打上不同的標記
2、在$dp$時難以處理模數不同的情況
考慮將資料分類後直接暴力所有可能的模數
3、$1e18$可能有19位,$maxn$要設為175
(一開始掃了一眼題解上$maxn$為165,以後還是要自己算啊……)
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...
HYSBZ 1799 self 同類分布
hysbz 1799 給出a,b,求出 a,b 中各位數字之和能整除原數的數的個數。sample input 10 19sample output 3hint 約束條件 1 a b 10 18 約束 乙個數是它自己數字和的倍數,直接dp根本找不到狀態,列舉數字和,因為總就162,然後問題就變成了乙個...
bzoj1799同類分布 數字DP
題目 數字dp。1 迴圈方法 預處理出每個位數上,和為某個數,模某個數餘某個數的所有情況 因為開四維會爆空間,所以省去模數,為此需要固定模數一次一次累加 餘數的轉移,以及可以填數的範圍都值得注意。如下 include include include using namespace std typed...