nyoj 881 小M的区间公约数
首先给的范围很大,是10^9。暴力解肯定超时(单用for循环到10^9都大约要2s-3s),首先写了个程序暴力的把两个数所有的约数都打印出来,最后发现所有的公约数都是最大公约数的约数,并且最大公约数的约数也一定是两个数的公约数,由此题目转换为求最大公约数的约数的问题,以为输入最大是10^9,所以公约数最大是5*10^8,求这个数的所有约数只需要循环到(跟号5)*10^4,for循环可以轻松应对了,直接用for得到所有的约数,然后qsort排序后,把数组的结构抽象成数轴上的n多个点,每个点都是这两个数的约数了,剩下的工作就是从大到小循环所有的公约数找第一个在查询区间里的约数就是要求的解。
附上AC代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int gcd(int a, int b)
{
if(b == 0)
return a;
else
return gcd(b, a % b);
}
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int array[10000];
int top;
int main()
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
memset(array, 0, sizeof(array));
top = 0;
int n;
if(a < b)
{
int swap = a;
a = b;
b = swap;
}
int max = gcd(a, b);
int i;
for(i = 1; i * i < max; i++)
{
if(max % i == 0)
{
array[top++] = i;
array[top++] = max / i;
}
}
if(i * i == max)
array[top ++] = i;
qsort(array, top, sizeof(int), cmp);
scanf("%d", &n);
while(n--)
{
int l, r;
scanf("%d %d", &l, &r);
int k;
if(l > max)
{
printf("-1\n");
continue;
}
for(k = 0; k < top; k++)
{
if(l <= array[k] && r >= array[k])
{
printf("%d\n", array[k]);
break;
}
else if(l > array[k])
{
printf("-1\n");
break;
}
}
}
}
return 0;
}
nyoj 881 小M的区间公约数的更多相关文章
- 小L的区间求和
题目描述 在给定的一个整数序列中,小L希望找到一个连续的区间,这个区间的和能够被k整除,请你帮小L算一下满足条件的最长的区间长度是多少. 输入 第一行输入两个整数n.k.(1 <= n < ...
- 【数学+思维】ZZULIOJ 1531: 小L的区间求和
题目链接 题目描述 在给定的一个整数序列中,小L希望找到一个连续的区间,这个区间的和能够被k整除,请你帮小L算一下满足条件的最长的区间长度是多少. 输入 第一行输入两个整数n.k.(1 <= n ...
- NYOJ 1067 Compress String(区间dp)
Compress String 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描写叙述 One day,a beautiful girl ask LYH to help he ...
- nyoj 255-C小加 之 随机数 (map)
255-C小加 之 随机数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:18 难度:1 题目描述: ACM队的“C小加”同学想在学校中请一些同学一起做一项问卷调查, ...
- nyoj 737 石子合并(区间DP)
737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No通过数:28 提交数:35 难度:3 题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为 ...
- nyoj 168 房间安排(区间覆盖)
房间安排 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间, ...
- nyoj 737 石子合并 经典区间 dp
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
- nyoj 1077 小博弈 【另类巴什博奕】
分析:分析当整除(a+b)的时候肯定是后者胜利,假设余数不等于0的时候.假设余数大于b肯定是前者胜利,否则后者胜利. 代码: import java.math.*; import java.util. ...
- nyoj 737 石子合并(一)。区间dp
http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...
随机推荐
- Bitmap文件格式+生成一个BMP文件
Bitmap的文件格式: #define UINT16 unsigned short #define DWORD unsigned int #define WORD short #define LON ...
- android驱动开发前的准备(五)
搭建S3C6410开发板的测试环境 首先安装串口调试工具 第一步:检测当前系统是否支持USB转串口 # lsmod | grep usbserial 第二步:安装minicom # apt-get i ...
- template 不能分别在.h和.cpp中定义模板
先上代码: #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> ; template <typename type> ...
- js或jquery如何获取父级、子级、兄弟元素(包括祖级、孙级等)
原生javascript方法: var a = document.getElementById("dom"); del_space(a); //清理空格 var b = a.chi ...
- 转:各种Adapter的用法
各种Adapter的用法 同样是一个ListView,可以用不同的Adapter让它显示出来,比如说最常用的ArrayAdapter,SimpleAdapter,SimpleCursorAdapt ...
- php中判断字符串是否全是中文或含有中文的实现代码
<?php header('Content-type:text/html; charset=utf-8'); $str = '你好'; if(preg_match('/^[\x{4e00}-\x ...
- php lock_sh共享锁 与 lock_ex排他锁
参考网站:http://hi.baidu.com/honly1215/item/8d27a66d11689c3aac3e83fe 文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LO ...
- unity, reduce android size
参考: https://www.youtube.com/watch?v=TYSmf_zgtZo http://stackoverflow.com/questions/41087220/how-to-u ...
- qsort函数、sort函数【转】
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...
- 【转】SSL/TLS协议运行机制的概述
互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...