設 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
mlogm
)o(n
mlogm) .
cnt但是 mp[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 的塊對應的值 .
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 匿名變數(沒有名字的變數)
在編碼過程中,可能會遇到沒有名稱的變數 型別或方法。雖然這不是必須的,但有時候這樣做可以極大地增強 的靈活性,這些變數被統稱為匿名變數。匿名變數的特點是乙個下畫線 本身就是乙個特殊的識別符號,被稱為空白識別符號。它可以像其他識別符號那樣用於變數的宣告或賦值 任何型別都可以賦值給它 但任何賦給這個識別...