关于一道题
  • 板块学术版
  • 楼主Iwara_qwq
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/9/24 13:56
  • 上次更新2023/10/27 10:09:45
查看原帖
关于一道题
724676
Iwara_qwq楼主2022/9/24 13:56

RT
今天我们模拟赛T1是这样一道题:

给定 llrr,求 maxlx,yr  and  xygcd(x,y)\max_{l\le x,y\le r \;\mathrm{and}\;x\ne y}\limits \gcd(x,y)tt 组数据)
1t103,1l,r2×1091\le t \le 10^3,1\le l,r\le 2\times10^9

我的做法:从 k=lk=-l 开始从大到小枚举答案,显然 lrl\sim r 之间有两个 kk 倍数且差为 kk 时最优,那么如果 lrl\sim r 之间只有一个 kk 的倍数
如图:
1663998733235.png
那么直接把 kk 调小直到 (n+1)kr(n+1)k\le r
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
const ll INF=0x7f7f7f7f7f,inf=0x3f3f3f3f3f;
namespace Yorihime_Nao{
	template<class T> T MAX(T x,T y){
		return x>y?x:y;
	}
	template<class T> T MIN(T x,T y){
		return x<y?x:y;
	}
	template<class T,class ... Arg> T MAX(T x,T y,Arg ... arg){
		return MAX(x>y?x:y,arg...);
	}
	template<class T,class ... Arg> T MIN(T x,T y,Arg ... arg){
		return MIN(x<y?x:y,arg...);
	}
	template<class T> T lowbit(T x){
		return x&-x;
	}
	template<class T> void SWAP(T &x,T &y){
		T qwq=x;
		x=y;
		y=qwq;
		return;
	}
}
using namespace Yorihime_Nao;
ll T;
ll x,y;
int main(){
//	freopen("pinesoot.in","r",stdin);
//	freopen("pinesoot.out","w",stdout);
	cin>>T;
	while(T--){
		cin>>x>>y;
		if(x%(y-x)==0&&y%(y-x)==0){
			cout<<y-x<<endl;
			continue;
		}
		for(int i=y-x;i>=1;i--){
			ll d=x/i*i;
			if(d<x)d+=i;
			if(d+i<=y){
				cout<<i<<endl;
				break;
			}
			ll B=(d+i)/i,l=B*i-y;
			i-=(l%B?l/B+1:l/B);
			i++;
//			cout<<i<<endl;
		}
	}
	return 0;
}

求证明时间复杂度(((
tip:正解整除分块q

2022/9/24 13:56
加载中...