沒有名字 整除分塊優化dp

2022-05-20 01:33:20 字數 2596 閱讀 2528

設 f[i,

j]f[

i,j]

表示 i

i 位置填 j

j 滿足條件的方案數, 則 f[i

,j]=

∑k=1

⌊mj⌋

f[i−

1,k]

f[i,

j]=k

=1∑⌊

jm​⌋

​f[i

−1,k

], 直接轉移複雜度 o(n

m2)o

(nm2

), 不可過 .

觀察到 ⌊mj

⌋⌊jm

​⌋的取值僅有 o(m

)o(m

​)個, 且轉移是字首和的形式, 因此考慮使用整除分塊字首和優化,

設 f′[i

,j]f

′[i,

j]表示 i

i 位置填整除分塊從大到小第 j

j值所對應的分母的方案數, g[i

,j]g

[i,j

] 表示 對應字首和, 則f′

[i,j

]=(r

[j]−

l[j]

+1)×

∑k=1

val[

j]f[

i−1,

k]=(

r[j]

−l[j

]+1)

×∑k=

1mp[

mval

[j]]

]f′[

i−1,

k]=(

r[j]

−l[j

]+1)

×g[i

−1,m

p[mv

al[j

]]]]

​f′[

i,j]

=(r[

j]−l

[j]+

1)×k

=1∑v

al[j

]​f[

i−1,

k]=(

r[j]

−l[j

]+1)

×k=1

∑mp[

val[

j]]m

​]​f

′[i−

1,k]

=(r[

j]−l

[j]+

1)×g

[i−1

,mp[

val[

j]]m

​]]​

最後 ans

=g[n

,cnt

]ans

=g[n

,cnt

], 使用std::map時間複雜度 o(n

mlog⁡m

)o(n

m​logm) .

cnt

cnt 為取值的總個數, 整除分塊的值從前往後單調不增 : m m-1 m-1 m-2 m-2 m-2 …mp

[x]m

p[x]

為 xx 對應的塊的編號 .va

l[i]

val[

i]表示編號為 i

i 的塊對應的值 .

但是 mp[

x]mp

[x] 直接使用std::map儲存會 tle

tle,

觀察到在從小到大列舉 j

j 時, ⌊mv

al[j

]⌋=⌊

mml[

j]⌋⌊

val[

j]m​

⌋=⌊l

[j]m

​m​⌋

的值是單調不增的, 且只會變化 mm​

次, 因此可以使用指標維護 .

時間複雜度 o(n

m)o(

nm​)

.

#include

#define reg register

const

int maxn =

1000005

;const

int mod =

1e9+7;

int n;

int m;

int cnt;

int mp[maxn]

;int val[maxn]

;int llim[maxn]

;int rlim[maxn]

;int f[

102]

[maxn]

;int g[

102]

[maxn]

;int

main()

for(reg int i =

2; i <= n; i ++)}

printf

("%d\n"

, g[n]

[cnt]);

return0;

}

為什麼匿名類是沒有名字的,明明有名字的解釋

首先大家看一下下面的 大家應該還算熟悉吧,他其實就是乙個匿名類。runnable runnable new runnable runnable是乙個介面,這個介面前面之所以new 了一下,並不能說明介面可以new,因為介面裡面重寫了介面中的抽象方法run。此時表明是乙個實現了介面的具體物件,只不過這...

golang 沒有名字引數 Go 返回引數命名

go 返回引數命名 在golang中,命名返回引數通常稱為命名引數。golang允許在函式簽名或定義中為函式的返回或結果引數指定名稱。或者可以說這是函式定義中返回變數的顯式命名。基本上,它解決了在return語句中提及變數名稱的要求。通過使用命名返回引數或命名引數,只能在函式末尾使用return關鍵...

Go 04 匿名變數(沒有名字的變數)

在編碼過程中,可能會遇到沒有名稱的變數 型別或方法。雖然這不是必須的,但有時候這樣做可以極大地增強 的靈活性,這些變數被統稱為匿名變數。匿名變數的特點是乙個下畫線 本身就是乙個特殊的識別符號,被稱為空白識別符號。它可以像其他識別符號那樣用於變數的宣告或賦值 任何型別都可以賦值給它 但任何賦給這個識別...