BZOJ 1799 self 同類分布

2021-08-28 18:21:41 字數 781 閱讀 5442

給出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是每一位數字的和的最大值。

#include #include #include using namespace std;

typedef long long ll;

ll a[20], dp[20][180][180];

ll dfs(int pos, int p, int sta1, int sta2, bool limit)

if (sta2 > p || sta2 + (pos + 1) * 9 < p)

if (!limit && dp[pos][sta1][sta2] != -1)

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

ll result = 0;

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

if (!limit)

return result;

}ll solve(ll x )

ll result = 0;

for (int i = 1; i <= pos * 9; i++)

return result;

}int main()

BZOJ 1799 self 同類分布

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

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