Loading [MathJax]/jax/element/mml/optable/BasicLatin.js
欢迎这位怪蜀黍来到《解题报告: CF75C Modified GCD - 童话镇里的星河 - 博客园》

解题报告: CF75C Modified GCD

题目链接:CF75C Modified GCD
大家都用了一种方法:

a|xb|x,gcd

然而我只会筛出一个数的因数然后暴力判断是否是另一个数的因数<-这就是我菜的结果了。

后边显然是一个简单二分,但是,
我们发现可能越界(比如找第一个大于他的数,结果......没有?!)
那么我们在最后放一个比较大的数即可。
时间复杂度为 \mathcal O(\sqrt{a}+m\log\sqrt{a})=\mathcal O(\sqrt{a}+m\log a),可以通过此题。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

#define read(x) scanf("%d",&x)

int aa,bb;
int x,y;
int m,a[100005],b[100005],cnt=0,c=0;

void get(int n)
{
	for(int i=1;i*i<=n;i++)
	{
		if(!(n%i)) a[++cnt]=i,a[++cnt]=n/i;
		if(i*i==n) cnt--;
	}
	return;
}

void check(int n)
{
	for(int i=1;i<=cnt;i++)
	{
		if(n%a[i]==0) b[++c]=a[i];
	}
	return;
}

int main()
{
	read(aa),read(bb);
	if(aa>bb) swap(aa,bb);
	get(aa);
	check(bb);
	sort(b+1,b+c+1);
	b[++c]=aa+bb;
	read(m);
	for(int i=1;i<=m;i++)
	{
		read(x),read(y);
		int l=1,r=c,mid;
		while(l<r)
		{
			mid=(l+r)>>1;
			if(b[mid]<x) l=mid+1;
			else r=mid;
		}
		int s=l;
		l=1,r=c;
		while(l<r)
		{
			mid=(l+r)>>1;
			if(b[mid]<=y) l=mid+1;
			else r=mid; 
		}
		int t=l-1;
		printf("%d\n",s<=t?b[t]:-1);
	}
	return 0;
}
posted @   童话镇里的星河  阅读(195)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示