洛谷 U140760 狭义公因子
洛谷 U140760 狭义公因子
题目背景
SeawaySeawa**y是热爱读书的好孩子。
有一天,SeawaySeawa**y正在读书。他看到了这样的一段描写——
闰土又对我说:
“现在太冷,你夏天到我们这里来。我们日里到海边捡贝壳去,红的绿的都有,鬼见怕也有,观音手也有。晚上我和爹管西瓜去,你也去。”
“管贼吗?”
“不是。走路的人口渴了摘一个瓜吃,我们这里是不算偷的。要管的是獾猪,刺猬,狭。月亮底下,你听,啦啦的响了,狭在咬瓜了。你便捏了胡叉,轻轻地走去……”
我那时并不知道这所谓狭的是怎么一件东西——便是现在也没有知道——只是无端的觉得状如小狗而很凶猛。
“他不咬人么?”
“有胡叉呢。走到了,看见狭了,你便刺。这畜生很伶俐,倒向你奔来,反从胯下窜了。他的皮毛是油一般的滑……”
——迅哥儿《故乡》
题目描述
书里的描述让SeawaySeawa**y无限神往。他不禁想象:鲁迅大神写的“狭”到底是什么东西呢?但残酷的生活不允许他多做思考,他被数学老师拉去做数学题了。但是,在做题的时候,他还是控制不住地想着这个东西。数学书里的符号也好像变成了一个个古灵精怪的小“狭”,在他的眼前飞舞。
于是,他灵光乍现:原来恁地!“狭”是狭义的意思!怪不得这畜生很伶俐!
他兴奋地抄起笔,在草纸上画出了自己的想象:
狭义公因子:
给定x,y,a,bx,y,a,b,定义a,ba,b在[x,y][x,y]内的最大公因子为狭义公因子,记作\text{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行,每行一个整数,表示\text{na-gcd}(a,b,x_i,y_i)na-gcd(a,b,x**i,y**i)。
若不存在合法的\text{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\n",v[pos]);
}
return 0;
}