洛谷 U140760 狭义公因子

洛谷 U140760 狭义公因子

洛谷传送门

题目背景

SeawaySeawa**y是热爱读书的好孩子。

有一天,SeawaySeawa**y正在读书。他看到了这样的一段描写——

闰土又对我说:

“现在太冷,你夏天到我们这里来。我们日里到海边捡贝壳去,红的绿的都有,鬼见怕也有,观音手也有。晚上我和爹管西瓜去,你也去。”

“管贼吗?”

“不是。走路的人口渴了摘一个瓜吃,我们这里是不算偷的。要管的是獾猪,刺猬,狭。月亮底下,你听,啦啦的响了,狭在咬瓜了。你便捏了胡叉,轻轻地走去……”

我那时并不知道这所谓狭的是怎么一件东西——便是现在也没有知道——只是无端的觉得状如小狗而很凶猛。

“他不咬人么?”

“有胡叉呢。走到了,看见狭了,你便刺。这畜生很伶俐,倒向你奔来,反从胯下窜了。他的皮毛是油一般的滑……”

——迅哥儿《故乡》

题目描述

书里的描述让SeawaySeawa**y无限神往。他不禁想象:鲁迅大神写的“狭”到底是什么东西呢?但残酷的生活不允许他多做思考,他被数学老师拉去做数学题了。但是,在做题的时候,他还是控制不住地想着这个东西。数学书里的符号也好像变成了一个个古灵精怪的小“狭”,在他的眼前飞舞。

于是,他灵光乍现:原来恁地!“狭”是狭义的意思!怪不得这畜生很伶俐!

他兴奋地抄起笔,在草纸上画出了自己的想象:

狭义公因子:

给定x,y,a,bx,y,a,b,定义a,ba,b在[x,y][x,y]内的最大公因子为狭义公因子,记作 ext{na-gcd}(a,b,x,y)na-gcd(a,b,x,y)。

输入格式

从文件narrow.innarro**w.i**n中读取数据。

第一行包括两个正整数a,ba,b。第二行包括一个整数TT,表示询问区间组数。接下来的TT行,每行两个整数x_i,y_ix**i,y**i。意义皆如题目描述所示。

输出格式

输出到文件narrow.outnarro**w.out中。

共TT行,每行一个整数,表示 ext{na-gcd}(a,b,x_i,y_i)na-gcd(a,b,x**i,y**i)。

若不存在合法的 ext{na-gcd}(a,b,x_i,y_i)na-gcd(a,b,x**i,y**i)。输出fake


题解:

nagcd,真有我的哈。

二分查找+单点求约数。

一开始S*写的权值线段树。

代码:

#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int a,b;
vector<int> v;
int gcd(int a,int b)
{
	return !b?a:gcd(b,a%b);
}
void fac(int x)
{
	for(int i=1;i<=sqrt(x);i++)
		if(x%i==0)
		{
			v.push_back(i),v.push_back(x/i);
			if(i==x/i)
				v.pop_back();
		}
}
int main()
{
	scanf("%d%d",&a,&b);
	int g=gcd(a,b);
	fac(g);
	sort(v.begin(),v.end());
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int pos=upper_bound(v.begin(),v.end(),y)-v.begin();
		pos--;
		if(v[pos]<x)
			puts("fake");
		else
			printf("%d
",v[pos]);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13999756.html