求解 ∑i=
1n[n
i]
\sum_^n [\frac]
∑i=1n
[in
]一般思路 o(n) 求解
但用分塊可以達到 o(n
\sqrt
n) 複雜度
理解:
為了避免每個 i 都計算一次,我們需要分塊
(i 不同時,有 k
kk 個 [ni
][\frac]
[in
]仍然相同,將他們分為一塊,貢獻即為 k∗[
ni
]k*[\frac]
k∗[in
])那麼問題關鍵就是 : 每一塊的 [ni
][\frac]
[in
]係數 k是多少呢
舉個栗子:
n =8
n = 8
n=8對 i 分塊: [1]、[2]、[3,4]、[5,6,7,8] ;
分別對應的 [ni
][\frac]
[in
] : 8、4、2、1;
首先不難知道
1.肯定是連續的分為一塊
2.對應的 [ni
][\frac]
[in
] 可以用 n 除 每塊的開頭元素
那要確定如何分塊
因為開頭元素就是上乙個塊的末尾元素 + 1,
所以 我們只要知道每塊的末尾元素就行了.
而每一塊的末尾元素就是整除的數(分界點,這個數之後 [ni
][\frac]
[in
]就減小了)
那麼係數k就是末尾元素 - 開頭元素 + 1(塊長度)
**:
int
main()
cout << ans << endl;
return0;
}
最近遇到較為麻煩,但也只需要數學+整除分塊寫法的題目:hdu 6940 湘潭邀請賽-c題
思路不多贅述,比較考驗數學功底。
int t;
ll x1, y1, x2, y2,inv2 =
500000004
, inv6 =
166666668
;ll cal
(ll x)
pll solve
(ll x1, ll x2)
else
if(l / x1 +
1< r / x1)
}return
pll(sumx, fx);}
intmain()
return0;
}
整除分塊(數論分塊)
乙個有 趣的問題 求 sum n lfloor frac ni rfloor n leq 10 顯然不能直接做廢話 經過一番冷靜推理暴力打表 我們發現以下性質 1.large lfloor frac ni rfloor 最多只有 2 sqrt 種取值 證明 對於 i le sqrt,只有 sqrt ...
C Floor and Mod 分塊整除
題目 a b i,a b i a i b 1 對於乙個b可以配出幾個i就可以產生幾個貢獻 可以知道對於給出的x,y 取任意1 b y,乙個b產生的貢獻為min x b 1 b 1 當x b 1 b 1 時對於此時的b的貢獻全取b 1 當x b 1 b 1 時按x b 1 的貢獻,此時用整除分塊求解 ...
整除分塊思想
對於求形如 sum lfloor frac rfloor 的值,就需要用到整除分塊,否則當n很大時就會超時。在普通的乙個乙個的計算時可以發現很多 lfloor frac rfloor 的值成塊狀分布,最終的到的規律是發現對於每乙個值相同的塊,它的最後乙個數就是n n i for int l 1,r ...