Codeforces Round 846 (Div. 2) E. Josuke and Complete Graph 详解 数论分块

题目大意


题意来源


解题思路

  • 首先我们假设存在 x x x满足 a , b ∈ [ l , r ] , g c d ( a , b ) = x a,b\in[l,r],gcd(a,b)=x a,b∈[l,r],gcd(a,b)=x
  • 那么肯定 g c d ( ⌊ a / x ⌋ , ⌊ b / x ⌋ ) = 1 就是互质 gcd(\lfloor a/x \rfloor, \lfloor b/x \rfloor)=1就是互质 gcd(⌊a/x⌋,⌊b/x⌋)=1就是互质
  • 假设 a < b a<b a<b
  • 那么 b 最小可以取 = ( ⌊ a / x ⌋ + 1 ) ∗ x b最小可以取 = (\lfloor a/x \rfloor +1)*x b最小可以取=(⌊a/x⌋+1)∗x 因为 ( ⌊ a / x ⌋ + 1 ) 和 ⌊ a / x ⌋ (\lfloor a/x \rfloor +1) 和 \lfloor a/x \rfloor (⌊a/x⌋+1)和⌊a/x⌋肯定互质
  • 那么我们可以贪心的找两个最小的倍数,就是 k x 和 ( k + 1 ) x ∈ [ l , r ] kx和(k+1)x\in[l,r] kx和(k+1)x∈[l,r]
  • 那么分类讨论一下
    • 如果 x ∈ [ l , r ] x\in[l,r] x∈[l,r]那么只要 x , 2 x ∈ [ l , r ] x,2x\in[l,r] x,2x∈[l,r]即可
    • 如果 x < l x<l x<l那么就是公式 k x ≥ l & & ( k + 1 ) x ≤ r kx\geq l \&\&(k+1)x\leq r kx≥l&&(k+1)x≤r
    • 那么根据贪心对于同一个 x x x,最小的 k = ⌈ l / x ⌉ k=\lceil l/x \rceil k=⌈l/x⌉,那么 x ≤ r / ( ⌈ l / x ⌉ + 1 ) x\leq r/(\lceil l/x \rceil+1) x≤r/(⌈l/x⌉+1)
    • 看到上面的向上取整,我们可以想到算法数论分块,因为对于同一个范围内的 x x x,这个最小的k值都是固定的
    • 现在把 ⌈ l / x ⌉ = ⌊ ( l − 1 ) / x + 1 ⌋ \lceil l/x \rceil = \lfloor (l-1)/x+1\rfloor ⌈l/x⌉=⌊(l−1)/x+1⌋就可以带入数论分块了
    • x ≤ r / ( ⌊ ( l − 1 ) / x + 1 ⌋ + 1 ) x\leq r/(\lfloor (l-1)/x+1\rfloor+1) x≤r/(⌊(l−1)/x+1⌋+1)

代码实现

cpp 复制代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 3005;
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
const ll mod = 998244353;
vector<int> arr;
ll sum, pre;
int main() {
    // freopen("1.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T --) {
        ll l,r;
        scanf("%lld%lld",&l,&r);
		ll ans = max(0ll,r/2-l+1);
		for(ll L = 1, R = 1; L < l; L = R + 1)	{
			ll num = (l-1)/L;
			R = min((l-1)/num,l-1); // 数论分块的右边界
			ll now = r/(num+2); // 上面不等式的右边
			// printf("now = %lld ans = %lld L = %lld R = %lld\n",now,ans,L,R);
			if(now >= L) ans += (min(now,R)-L+1);

		}
		printf("%lld\n",ans);
    } 
    return 0;
}
相关推荐
闻缺陷则喜何志丹3 天前
【数论 快速指数幂 龟速乘】P8652 [蓝桥杯 2017 国 C] 小数第 n 位|普及+
c++·蓝桥杯·数论·快速指数幂·龟速乘
闻缺陷则喜何志丹9 天前
【数论】P12191 [蓝桥杯 2025 省研究生组] 01 串|普及+
c++·数学·蓝桥杯·数论·洛谷
_OP_CHEN13 天前
【算法基础篇】(五十)扩展中国剩余定理(EXCRT)深度精讲:突破模数互质限制
c++·算法·蓝桥杯·数论·同余方程·扩展欧几里得算法·acm/icpc
_OP_CHEN14 天前
【算法基础篇】(四十九)数论之中国剩余定理终极指南:从孙子算经到算法竞赛
算法·蓝桥杯·数论·中国剩余定理·算法竞赛·乘法逆元·acm/icpc
_OP_CHEN18 天前
【算法基础篇】(四十七)乘法逆元终极宝典:从模除困境到三种解法全解析
c++·算法·蓝桥杯·数论·算法竞赛·乘法逆元·acm/icpc
_OP_CHEN22 天前
【算法基础篇】(四十六)同余方程终极攻略:从基础转化到实战破解
c++·算法·蓝桥杯·数论·同余方程·扩展欧几里得算法·acm/icpc
_OP_CHEN24 天前
【算法基础篇】(四十五)裴蜀定理与扩展欧几里得算法:从不定方程到数论万能钥匙
算法·蓝桥杯·数论·算法竞赛·裴蜀定理·扩展欧几里得算法·acm/icpc
_OP_CHEN1 个月前
【算法基础篇】(四十二)数论之欧拉函数深度精讲:从互质到数论应用
c++·算法·蓝桥杯·数论·欧拉函数·算法竞赛·acm/icpc
_OP_CHEN1 个月前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
君义_noip1 个月前
信息学奥赛一本通 1644:【例 4】佳佳的 Fibonacci
c++·数论·信息学奥赛·csp-s