題目
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)的貢獻,此時用整除分塊求解
另注意下範圍,細節見**
code:
#include
#include
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using
namespace std;
typedef
long
long ll;
intmain()
ans +
=(r - l +1)
*(a /
(l));}
ll k =
min(
(double
)b-1
,max
(2.0
,ceil
(sqrt((
double
)a -
1.0)))
-1-1
);ans +=(
1+ k)
* k /2;
cout << ans << endl;
}}
整除分塊(數論分塊)
乙個有 趣的問題 求 sum n lfloor frac ni rfloor n leq 10 顯然不能直接做廢話 經過一番冷靜推理暴力打表 我們發現以下性質 1.large lfloor frac ni rfloor 最多只有 2 sqrt 種取值 證明 對於 i le sqrt,只有 sqrt ...
分塊 分塊練習三題
分塊嘛 馮巨道德午餐講過的 唯一不同的是可能需要st n ed n 來記錄一下範圍 例教主的魔法 板 include using namespace std define in read int in const int n 1e6 5 int n,q,a n b n add n int siz,m...
分塊3 6279 數列分塊入門 3
題目描述 給出乙個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,詢問區間內小於某個值 xx 的前驅 比其小的最大元素 輸入格式 第一行輸入乙個數字 nn。第二行輸入 nn 個數字,第 ii 個數字為 a iai 以空格隔開。接下來輸入 nn 行詢問,每行輸入四個數字 mathrmopt ...