zoukankan      html  css  js  c++  java
  • CF75C Modified GCD

    CF75C Modified GCD

    洛谷传送门

    题目描述

    Well, here is another math class task. In mathematics, GCD is the greatest common divisor, and it's an easy task to calculate the GCD between two positive integers.

    A common divisor for two positive numbers is a number which both numbers are divisible by.

    But your teacher wants to give you a harder task, in this task you have to find the greatest common divisor dd between two integers aa and bb that is in a given range from lowlow to highhig**h (inclusive), i.e. low<=d<=highlow<=d<=hig**h . It is possible that there is no common divisor in the given range.

    You will be given the two integers aa and bb , then nn queries. Each query is a range from lowlow to highhig**h and you have to answer each query.

    输入格式

    The first line contains two integers aa and bb , the two integers as described above ( 1<=a,b<=10^{9}1<=a,b<=109 ). The second line contains one integer nn , the number of queries ( 1<=n<=10^{4}1<=n<=104 ). Then nn lines follow, each line contains one query consisting of two integers, lowlow and highhig**h ( 1<=low<=high<=10^{9}1<=low<=hig**h<=109 ).

    输出格式

    Print nn lines. The ii -th of them should contain the result of the ii -th query in the input. If there is no common divisor in the given range for any query, you should print -1 as a result for this query.

    题意翻译

    题目大意:

    找出a,b的最大公因子,然后给几个查询,每次查询包含x,y两个数字,查询在x~y之间的a,b的最大公因子

    Translated by @Harryheqg


    题解:

    关键性质:

    两个数的任意公因子一定是其最大公因子的因子。

    这个性质的正确性是显然的。

    如果数感不太好,完全可以用反证法证明一下。

    然后就自然而然地想到先求gcd,再处理gcd的所有约数,再在其上二分查找。

    二分查找的形式多种多样,可以手动,也可以STL upper_bound,你要是喜欢,打一棵权值线段树也没人管你。

    我用的是upper_bound:

    代码:

    #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("-1");
    		else
    			printf("%d
    ",v[pos]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Matlab 整数线性规划问题模型代码
    Matlab 非线性规划问题模型代码
    Matlab 线性规划问题模型代码
    多波次导弹发射中的规划问题(二) 问题一解答
    多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
    多无人机对组网雷达的协同干扰问题 数学建模
    余胜威《MATLAB数学建模经典案例实战》2015年版
    袁新生《LINGO和Excel在数学建模中的应用》
    卓金武《MATLAB在数学建模中的应用》 第2版
    司守奎《数学建模算法与应用》 第二版
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13999605.html
Copyright © 2011-2022 走看看