CF75C Modified GCD

这题,貌似无从下手QAQ

但是很简单就可以想到二分吧,正好二分能过QAQ

自然就是先跑一个gcd~~(想必大家都会了)~~

然后…

然后就是一个二分呀QAQ

上代码

#include<bits/stdc++.h>
using namespace std;
int A,B,N,number=0;
int divisor[10000];
int gcd(int x,int y)//gcd
{
	if(y==0)return x;
	return gcd(y,x%y);
}
void solve()
{
	int low,high;
	scanf("%d%d",&low,&high);//每次查询的区间
	int _left=1,_right=number,middle,answer=-1;
	while(_left<=_right)//二分
	{
		middle=(_left+_right)/2;//取mid
		if(divisor[middle]>high/*判断是大了还是小了*/)_right=middle-1;else
		{
			_left=middle+1;
			if(divisor[middle]>=low)answer=divisor[middle];//记录下答案
		}
	}
	printf("%d\n",answer);//输出answer
}
int main()
{
	scanf("%d%d",&A,&B);
	int num=gcd(A,B);//记录下gcd后的值
	int Max=(int)(sqrt(num)),i;
	for(i=1;i<=Max;i++)
	if(num%i==0)//取出因数
	{
		divisor[++number]=i;
		divisor[++number]=num/i;
	}
	sort(divisor+1,divisor+number+1);//排一下序,符合单调性
	scanf("%d",&N);
	for(i=1;i<=N;i++)solve();//解决问题QAQ
}

然后



过了…

发布了72 篇原创文章 · 获赞 22 · 访问量 5537

猜你喜欢

转载自blog.csdn.net/sxy__orz/article/details/90727765
gcd