【整除分块】【数论】C. Floor and Mod

149 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目链接

codeforces.com/problemset/…

定义一对数 ( a , b ) (a,b) (a,b) 是特殊的,当且仅当 ⌊ a b ⌋ = a   m o d   b \lfloor\dfrac{a}{b}\rfloor=a\bmod b ⌊ba​⌋=amodb
给定 x 和 y ,求一共有多少对特殊的数 ( a , b ) (a,b) (a,b), 1 ≤ a ≤ x , 1 ≤ b ≤ y 1\le a\le x,1\le b\le y 1≤a≤x,1≤b≤y


思路

这种推导式子的一般就是不断的对式子进行变形,然后在过程中发现相关的特性。

本题根据数据范围看,要么是结论题,要么是O(N)O(\sqrt N)的算法

ab=aabb\lfloor \frac{a}{b} \rfloor = a - \lfloor \frac{a}{b} \rfloor * b

ab(b+1)=a\lfloor \frac{a}{b} \rfloor(b + 1) = a

ab=ab+1\lfloor \frac{a}{b} \rfloor=\frac{a}{b+1}

这时发现特性:ab\lfloor \frac{a}{b} \rfloor是整数,那么ab+1\frac{a}{b+1}也是整数,则a是b+1的倍数,即(b+1)a(b+1)|a

然后根据ab=a%b\lfloor \frac{a}{b} \rfloor=a\%b

得到0ab<b0 \leq\lfloor \frac{a}{b} \rfloor<b

代换一下ab\lfloor \frac{a}{b} \rfloor得到ab+1<b\frac{a}{b+1}<b, 则0a<b2+b0 \leq a \lt b^2 + b

结合上述两点性质,得到a的个数为b2+b1b+1\frac{b^2+b-1}{b+1}

因为ab需要满足固定的范围,则答案

res=b=1ymin(x,b2+b1)b+1res = \sum_{b=1}^{y} \frac{min(x, b^2+b-1)}{b+1}

我们只需要将b枚举到x\sqrt x即可,后面上面分子始终取x,后面就可以用整除分块解决问题

l=b+1l = b + 1进行整除分块,注意整除分块时还要注意对应的范围,l<=y+1l<=y+1,因为初始就加了一

l<=xl <= x是因为后面就取零了,不能算上去,所以这个是右边界


代码

#include<bits/stdc++.h>
using namespace std;

using ll = long long;

void solve()
{
	ll x, y;
	cin >> x >> y;
	
	ll res = 0;
	
	ll a = 1, b = 1;
	for(; b * b - 1 <= x && b <= y; b++)
		res += (b * b + b - 1) / (b + 1);
	
	ll l = b + 1, r;
	
	for(; l <= x && l <= y + 1; l = r + 1)
	{
		r = min(x / (x / l), y + 1);
		
		res += x / l * (r - l + 1);
		if(r == y + 1) 
			break;
	}
	cout << res << "\n";

}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin >> t;
//	t = 1;
	while(t--)
		solve();
	return 0;
}

整除分块篇

blog.csdn.net/qq_50285142…