A+B Again(在某个数中找大于m的最小约数)
A+B Again
Accepted : 15 Submit : 243
Time Limit : 1000 MS Memory Limit : 65536 KB
题目描述
上次趣味赛小明的a+b坑了不少不喜欢思考的同学,小明为了表示歉意, 这次出了道简单的a+b给大家当签到题,希望大家能开心刷题。 那么,题目来了!!!
求使得b/(a+x)为整数的最小正整数x的值。
输入
第一行是一个整数K(K≤10000),表示样例的个数。 以后每行一个样例,为两个正整数a,b(1≤a,b≤108)。
输出
每行输出一个样例的结果,如果不存在这样的x,输出-1。
样例输入
3
1 2
1 3
1 4
样例输出
1
2
1
高手的思路:开始我找出b的所有质因数 复杂度logN的,后来求每个质因数生成的约数即质因数m*(1,2,3...)(复杂度大了)和筛法的思想类似,
再sort,再扫一遍找大于a的最小约数,结果T了,在10^7的数据大小时就T了。
所以改一下,不需要生成所有的约数,每个质因数只要生成一个大于a的最小约数就可,这样就一共生成了和质因数数目一样多的约数(小于OlogN),再sort即可。
ACKNOWLEDGE: http://94it.net/a/jingxuanboke/2015/0112/446788.html
/*
思路:开始我找出b的所有质因数 复杂度logN的,后来求每个质因数生成的约数即质因数m*(1,2,3...)(复杂度大了)和筛法的思想类似,
再sort,再扫一遍找大于a的最小约数,结果T了,在10^7的数据大小时就T了。
所以改一下,不需要生成所有的约数,每个质因数只要生成一个大于a的最小约数就可,这样就一共生成了和质因数数目一样多的约数(小于OlogN),再sort即可。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
int a,b,su;
vector<int>s;
vector<int>all;
void solve()
{
int temp=b;
if(a>=temp){ cout<<"-1"<<endl; return; } //特判
//找质因数:
for(int i=;i*i<=temp;i++)
{ if(temp%i==) { s.push_back(i); while(temp%i==) temp/=i; } }
s.push_back(b); // 因为b本身可能就是素数,所以要在vector里加b,就算不是素数,也对结果无影响。
for(int i=;i<s.size();i++) //生成s.size()个约数。
{ su=s[i]; int m=a/su+; all.push_back(su*m); }
sort(all.begin(),all.end());
for(int i=;i<all.size();i++)
if(all[i]>a)
{cout<<all[i]-a<<endl;return ;}
}
int main()
{
freopen("b.txt","r",stdin);
int T; cin>>T; while(T--) { cin>>a>>b; s.clear(); all.clear(); solve(); } return ;
}
队列
A+B Again(在某个数中找大于m的最小约数)的更多相关文章
- ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)
1061: 从三个数中找出最大的数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 124[Submit][Status][We ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- hdu 1258 从n个数中找和为t的组合 (DFS)
题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...
- poj2578---三个数中找出第一个大于168的
#include <stdio.h> #include <stdlib.h> int main() { int a,b,c; scanf("%d %d %d" ...
- 海量数据中找top K专题
1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...
- 一道经典的面试题:如何从N个数中选出最大(小)的n个数
转载:https://zhidao.baidu.com/question/1893908497885440140.html 这个问题我前前后后考虑了有快一年了,也和不少人讨论过.据我得到的消息,Goo ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- 在数组中找几个数的和等于某个数[LeetCode]
首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会 ...
- 3sum(从数组中找出三个数的和为0)
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
随机推荐
- .NET Web开发初学者必知的四个网站
No.1 W3school 链接: http://www.w3school.com.cn/ 预览: 介绍: 全球最大Web前端技术教程网站.内容涵盖从基础的 HTML 到 CSS到进阶的XML.SQL ...
- mysql慢查询分析工作pt-query-digest的使用
一.简单安装 wget percona.com/get/pt-query-digest chmoe u+x pt-query-digest 二.简单使用 ./pt-query-digest /var/ ...
- Boostrap(4)
1.按钮 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...
- JavaScript表单处理(下)
内容提纲: 1.文本框脚本 2.选择框脚本 发文不易,转载请亲注明链接出处,谢谢! 一.文本框脚本 在HTML中,有两种方式来表现文本框: 一种是单行文本框<input type=" ...
- AngularJs-MVC之路由、模块以及依赖注入
前面呢,我们大概的了解了下AngularJs的入门,也做过了hello world的一个demo,不知道大家有没有掌握呢?在下面我们需要讲一些AngularJS的一些干货. 1,一个完整项目的目录结构 ...
- Spring MVC框架
这个Spring Web MVC 框架提供了模型视图控制器的架构,这种结构能够被用来开发灵活的和松耦合的Web应用程序. 这种MVC模式能够将应用程序分离成不同的层面,(输入逻辑,业务逻辑,UI逻辑) ...
- BZOJ2456 mode
Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n. 第2行n个正整数用空格隔开. Output 一行一个正整数 ...
- [NOIP2011] 提高组 洛谷P1003 铺地毯
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- CODEVS 1959 拔河比赛(另一版本)
题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 ...
- UVa 1025 A Spy in the Metro
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 预处理出每个时间.每个车站是否有火车 为了方便判断是否可行,倒推处理 ...