BZOJ 1799 self 同類分布

2022-05-13 10:59:42 字數 1013 閱讀 1982

bzoj 1799 傳送門

一句話的題目,看得爽,做得煩

一般這類和數字相關的都是數字$dp$吧

不過一開始還是感覺不太可做,畢竟每個數模數不同

但要發現,模數最高也只可能為$9*19=171$,

於是只要將數按照他們的數字和(即模數)分類計算即可

這樣便暴力解決了模數不同的問題

設$dp[sp][sum][rmd][lmt]$表示:

列舉到第$sp$高位,剩下的數的和位$sum$,此時對$mod$餘$rmd$時的方案數(lmt表示是否達到上界)

感覺數字$dp$還是用記憶化搜尋寫起來邏輯比較清晰吧

#include using

namespace

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...