BZOJ 1799 同類分布 數字DP

2022-05-26 23:39:07 字數 1567 閱讀 9743

給出a,b,求出[a,b]中各位數字之和能整除原數的數的個數。1<=a<=b<=1e18.

注意到各位數字之和最大是153.考慮列舉這個東西。那麼需要統計的是[0,a-1]和[0,b]內各位數字之和為x且能整除x的數字個數。

那麼我們只需要數字dp一波即可。

令dp[pos][i][x]表示有pos位且數字之和為x的數mod p=i的數字個數。

則轉移方程顯然可得。

# include # include 

# include

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

# define lowbit(x) ((x)&(-x))

# define pi acos(-1.0

)# define eps 1e-9

# define mod

1024523

# define inf

1000000000

# define mem(a,b) memset(a,b,

sizeof

(a))

# define for(i,a,n)

for(int i=a; i<=n; ++i)

# define fo(i,a,n)

for(int i=a; ii)

# define bug puts("h

");# define lch p

<<1

,l,mid

# define rch p

<<1|1,mid+1

,r# define mp make_pair

# define pb push_back

typedef pair

pii;

typedef vector

vi;# pragma comment(linker,

"/stack:1024000000,1024000000")

typedef

long

long

ll;int

scan()

while(ch>='

0'&&ch<='9')

return x*f;

}void out(int

a)

if(a>=10) out(a/10

); putchar(a%10+'0'

);}const

int n=55;//

code begin...

ll dp[

20][165][165], p[20

];int wei[20

];ll dfs(

int pos, int mod, int limit, int x, int

p)ll sol(ll x)

intmain ()

view code

bzoj1799同類分布 數字DP

題目 數字dp。1 迴圈方法 預處理出每個位數上,和為某個數,模某個數餘某個數的所有情況 因為開四維會爆空間,所以省去模數,為此需要固定模數一次一次累加 餘數的轉移,以及可以填數的範圍都值得注意。如下 include include include using namespace std typed...

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