第k大公约数(简单数学,逻辑转换)

遇到一个挺有意思的题目,要求两个数的第k大公约数(当然k=1时就是最大公约数),如

12 6 2

3

范围,a和b<=1e14,k<=1e9。

所以暴力是肯定不行的,这题的关键就是:能被最大公约数整除的一定也是两数的公约数!!这就可以做出来了

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <cmath>
 8 using namespace std;
 9 typedef long long ll;
10 ll a,b,k;
11 ll gcd(ll a,ll b)
12 {
13     return b?gcd(b,a%b):a;
14 }
15 bool cmp(ll aa,ll bb)
16 {
17     return aa>bb;
18 }
19 vector<ll> vec;
20
21 int main()
22 {
23     ios::sync_with_stdio(false); cin.tie(0);
24
25     cin>>a>>b>>k;
26
27     ll ans=gcd(a,b);
28     for(ll i=1;i*i<=ans;i++)//最大公约数整除的也是公约数!
29     {
30         if(ans%i==0)
31         {
32             vec.push_back(i);
33             ll j=ans/i;
34             if(j!=i) vec.push_back(j);
35         }
36     }
37
38     sort(vec.begin(),vec.end(),cmp);
39     if(k>vec.size()) cout<<"No solution!"<<endl;
40     else cout<<vec[k-1]<<endl;
41
42     return 0;
43 }

完。

原文地址:https://www.cnblogs.com/redblackk/p/9785806.html

时间: 2024-10-04 03:27:27

第k大公约数(简单数学,逻辑转换)的相关文章

XTUOJ ABK(求出A和B的第K大公约数)

Accepted : 21   Submit : 171 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 ABK是一个比A+B还要简单的题目,给出两个整数A,B,求出A和B的第K大公约数. 输入 第一行是一个整数N(N ≤ 10000),表示样例的个数. 以后每行一个样例,为3个整数A,B,K (1≤A,B≤109 , 1≤K≤10) 输出 每行输出一个整数d,表示A,B的第K大公约数 若没有第K大的公约数则输出-1. 思路:先求出a和b

hdu 5019(第K大公约数)

Revenge of GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2140    Accepted Submission(s): 596 Problem Description In mathematics, the greatest common divisor (gcd), also known as the greate

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

HDU 1018 Big Number (简单数学)

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25649    Accepted Submission(s): 11635 Problem Description In many applications very large integers numbers are required. Some of these

SGU - 123 - The sum (简单数学!)

SGU - 123 The sum Time Limit: 250MS   Memory Limit: 4096KB   64bit IO Format: %I64d & %I64u Submit Status Description Here is your second problem, keep calm and solve it . Nacci sequence of numbers is known to all : F1 = 1; F2 = 1; Fn+1 = Fn + Fn-1,

hdu 2200 Eddy&#39;s AC难题(简单数学。。)

题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. 代码: ll C(int n,int x){ ll ans=1; rep(i,1,x){ ans = ans*(n+1-i)/i; } return ans; } int main(){ int n; while(cin>>n){ ll ans = 0; rep(i,2,n){ ans += (C

D是10^k的约数快速求解整除性问题

[D是10^k的约数快速求解整除性问题] 定理: 证明: 例一: 例二: 例三:

有没有最简单的xml转换java类的方法

原文:有没有最简单的xml转换java类的方法 代码下载地址:http://www.zuidaima.com/share/1550463237098496.htm 手动编码太烦人了,每次新增一个java entity类都需要写一个解析器. 有没有最简单的xml转换java类的方法,布布扣,bubuko.com

小小的项目——简单的注释转换

StdAfx.h文件实现各种预定义. #ifndef _STDAFX_H #define _STDAFX_H #define UL unsigned long #endif constd编写相应的实现方法. #include<stdio.h> #include<stdlib.h> #include"StdAfx.h" extern "C" void converter(FILE *input,FILE *output); //表示以C的环境访