分段打表 HDU4389 P2657

2021-10-10 18:11:38 字數 1206 閱讀 2950

hdu4389題目大意:

t

tt組詢問,每次詢問乙個區間[l,

r]

[l,r]

[l,r

].問你區間內有多少個數x%d

igx=

0,di

gx

x \ \% \ dig_x =0,dig_x

x%digx

​=0,

digx

​代表數x的數字和.

t ≤50

,n≤1

e9

t \leq 50 , n \leq 1e9

t≤50,n

≤1e9

題目思路:

分塊打表,設定步伐 d=1

e6

d = 1e6

d=1e

6.打出1000

1000

1000

個結果放入陣列.詢問時按照分塊的思想,查詢在第幾個塊得到答案,然後對餘下的塊進行暴力計算即可。

時間複雜度:o(t

∗d∗l

ogd)

o(t*d*logd)

o(t∗d∗

logd

) .實際執行1.3s.

ac**:

#include

using

namespace std;

#define ll long long

int res[

1005]=

;int cal (

int x)

return res;

}int solve (

int x)

return sum;

}int

main()

return0;

}

p2657題目大意:

詢問乙個區間[l,

r]

[l,r]

[l,r

].問你區間內有多少個不含前導零且相鄰兩個數字之差至少為 2 的正整數.

題目思路:

一樣。總結:

一類 詢問較少(t

≤100

t \leq 100

t≤10

0),上限較小(n≤2

e9

n \leq 2e9

n≤2e

9)的數字dp類題目可以考慮使用分段打表。

HDU 4389 (分塊打表)

題意 f x 表示x的各數字的和,給出 l,r 問區間中有多少個數x,存在x mod f x 0 思路 l,r範圍在1e9,估算複雜度後發現應該可以遞推打出乙個表,按1000000每塊,分塊後將塊內答案儲存在陣列中,塊間累加,塊內暴力,查詢即可。好像正解是數字dp include include i...

hdu 4548 素數打表

方法 篩法打表,再將是素數的中判斷是不是美素數。比較裸。但是就是一開始這樣做會超時。重新用乙個陣列來儲存到當前數字時已經出現了幾個美素數,最後將區間兩端所對應的相互減一下就可以了。include include include using namespace std define m 1000001...

hdu 1443 Joseph 暴力打表

題目大意 k個好人,k個壞人,確定n,利用joseph方法刪除所有壞人.由於資料規模,可以利用暴力打表,以後能打表就盡量打表。這題原本模擬資料時間完全夠的,但是測試資料有很多重複的,導致很多人超時,暗坑!以後要注意點這種情況。打表 includeint main while scanf d n n ...