首页 > 其他分享 >Codeforces Round #846 (Div. 2) E. Josuke and Complete Graph(数论分块)

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

时间:2023-01-26 21:12:17浏览次数:61  
标签:846 lceil Complete int Graph Codeforces rceil

题意:给定一个区间[L,R],求其中任意两个数字的gcd的不同的种类总数。
链接:https://codeforces.com/contest/1780/problem/E
其中L<=1e9,1<=L<=R<=1e18。
tips:本篇题解中除标为上取整外所有/均代表下取整
其等价于求x,\(\lceil L/x \rceil\) * x与(\(\lceil L/x \rceil\) +1) * x在[L,R]中,又前者>=L,只需(\(\lceil L/x \rceil\)+1)*x<=R,求有多少个x满足条件。

对于x>=L的数而言,(\(\lceil L/x \rceil\) +1) *x = 2x,故x<=(R/2),共有(R/2 - L+1)个数满足。

对于 x<L而言,可整除分块,\(\lceil L/x \rceil\)总共只有sqrt(L)个,复杂度满足要求。

具体地,对于每个,\(\lceil L/x \rceil\) 而言,有[l,r]中的数所得结果一致,其中满足要求的数必须(,\(\lceil L/x \rceil\) + 1)* x<=R,故l<=x<=min(r,R/(\(\lceil L/x \rceil\)+1)).即可得到答案。

代码:

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

void solve(){
	int L,R;cin>>L>>R;
	int ans=max((int)0,(R/2-L+1));
	for(int l=1,r;l<L;l=r+1){
		int k=(L+l-1)/l;
		r=(L+k-2)/(k-1)-1;
		int w=-l+1+min(r,(R)/(k+1));
		w=max((int)0,w);
		ans+=w;
	}
	cout<<ans<<endl;
}
signed main(){
	int T;cin>>T;
	while(T--) solve();
	
}

标签:846,lceil,Complete,int,Graph,Codeforces,rceil
From: https://www.cnblogs.com/wjhqwq/p/17068205.html

相关文章