题目描述:

H. Maximal GCD
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given positive integer number n. You should create such strictly increasing sequence of k positive numbers a1, a2, ..., ak, that their sum is equal to n and greatest common divisor is maximal.

Greatest common divisor of sequence is maximum of such numbers that every element of sequence is divisible by them.

If there is no possible sequence then output -1.

Input

The first line consists of two numbers n and k (1 ≤ n, k ≤ 1010).

Output

If the answer exists then output k numbers — resulting sequence. Otherwise output -1. If there are multiple answers, print any of them.

Examples
Input

Copy
6 3
Output

Copy
1 2 3
Input

Copy
8 2
Output

Copy
2 6
Input

Copy
5 3
Output

Copy
-1

思路:

这个题是要给一个数n,一个数k,看能不能凑出一组含k个元素的严格递增数列,这组数的和为n,还要让这组数的最大公约数最大。

刚开始,a1+a2+...+ak=n>=a1+(a1+1)+(a1+2)+...+(ak+k-1),解得1<=a1<=(n-k*(k-1)/2)/k,既然要求公约数最大,把a的所有因数找出来,从大往小一个个试,

比如,找到一个f是a1的因数,既然要f为这组数的gcd,那f一定也是n的因数,检查一下,不是就跳过,是就n/f,变成找一个严格递增数列和为n/f,就不用考虑公因数了。

刚开始把过多的注意力放到了a1上,就把所有a1可能值一个个遍历,分别找因数,分别检查,结果是错的,而且程序逻辑及其混乱+复杂,还有好多要特判的地方(疯了我已经快)因为每一个a1都有因数1,最后对于较大的a1来说(从大往小检查)总会到1就停止,以为算出了最终结果。

所以后来把所有a的所有因数放到一个set里,也方便找最大值,从大往小遍历所有因数。就好了。。。吗?

结果超时。

仔细想想,怎么办。既然最后都是a1的因数f如果满足题目条件,那么它也是n的因数,那就把n的因数找出来就好了啊。

(٩(๑>◡<๑)۶),注意的是在枚举n的因数是不要忘了f要满足a1的上下界的限制,满足的才加到set中去。

但是但是,还要注意,一开始判断可不可能构造出这么一个数列,a1+a2+...+ak=n>=ka1+k*(k-1)/2>=k+k*(k-1)/2,以为完了?nonono,要注意题目数据范围,如果来个4*10^9这种,long long也存不下啊,那咋办,用double来存k吧...

Type

Size

数值范围

无值型void

0 byte

无值域

布尔型bool

1 byte

true   false

有符号短整型short [int] /signed short [int]

2 byte

-32768~32767

无符号短整型unsigned short [int]

2 byte

0~65535

有符号整型int /signed [int]

4 byte

-2147483648~2147483647

无符号整型unsigned [int]

4 byte

0~4294967295

有符号长整型long [int]/signed long [int]

4 byte

-2147483648~2147483647

无符号长整型unsigned long [int]

4 byte

0~4294967295

long long

8 byte

0~18446744073709552000

有符号字符型char/signed char

1 byte

-128~127

无符号字符型unsigned char

1 byte

0~255

宽字符型wchar_t (unsigned short.)

2 byte

0~65535

单精度浮点型float

4 byte

-3.4E-38~3.4E+38

双精度浮点型double

8 byte

1.7E-308~1.7E+308

long double

8 byte

(上表来源见下面博客)

知识点:贪心,数论(一点点)

代码:

 #include <iostream>
#include <cmath>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
long long n;
double k;
set<long long> fac;
vector<long long> num;
int main()
{
cin >> n >> k;
if(k+k*(k-)/<=n)
{
long long uper1 = (n-k*(k-)/)/k;
long long lower1 = ;
//cout << uper1 << " " << lower1 << endl;
long long qz = ;
/*for(long long a = uper1; a>=lower1; a--)
{
for(long long i = 1; i<sqrt(a)+1; i++)
{
if(a%i==0)
{
fac.insert(i);
fac.insert(a/i);
}
}
}*/
for(long long i = ;i<sqrt(n)+;i++)
{
if(n%i==)
{
if(i<=uper1)
{
fac.insert(i);
}
if(n/i<=uper1)
{
fac.insert(n/i);
}
}
}
/*cout << "fac " << endl;
for(auto ite = fac.rbegin();ite!=fac.rend();ite++)
{
cout << *ite << " ";
}
cout << endl;*/
for(auto ite = fac.rbegin(); ite!=fac.rend(); ite++)
{
//cout << "ite " << *ite << endl;
int flag = ;
num.clear();
long long sum = n/(*ite)-;
int shu = ;
num.push_back(shu);
if(sum)
{
shu++;
while(shu<=sum&&num.size()<k-)
{
num.push_back(shu);
sum -= shu;
shu++; }
if(shu<=sum)
{
qz = *ite;
//cout << "qz " << qz << endl;
num.push_back(sum);
break;
}
}
else
{
qz = *ite;
break;
}
}
for(int i = ;i<num.size();i++)
{
cout << qz*num[i] << " ";
}
cout << endl;
}
else
{
cout << - << endl;
}
return ;
}

参考资料:

年少轻狂12138,C++基本数据类型大小及表示范围,https://blog.csdn.net/weixin_40709898/article/details/79368310(间接引用,因为上面的博客也是转载但找不到原博客)

Codeforces H. Maximal GCD(贪心)的更多相关文章

  1. CodeForce-803C Maximal GCD(贪心数学)

    Maximal GCD CodeForces - 803C 现在给定一个正整数 n.你需要找到 k 个严格递增的正整数 a1, a2, ..., ak,满足他们的和等于 n 并且他们的最大公因数尽量大 ...

  2. codeforces 803C Maximal GCD(GCD数学)

    Maximal GCD 题目链接:http://codeforces.com/contest/803/problem/C 题目大意: 给你n,k(1<=n,k<=1e10). 要你输出k个 ...

  3. Codeforces 803C. Maximal GCD 二分

    C. Maximal GCD time limit per test: 1 second memory limit per test: 256 megabytes input: standard in ...

  4. 【数学】codeforces C. Maximal GCD

    http://codeforces.com/contest/803/problem/C [题意] 给定两个数n,k(1 ≤ n, k ≤ 10^10) 要你输出k个数,满足以下条件: ①这k个数之和等 ...

  5. CodeForces - 803C Maximal GCD 【构造】

    You are given positive integer number n. You should create such strictly increasing sequence of k po ...

  6. Codeforces 803C. Maximal GCD

    题目链接:http://codeforces.com/contest/803/problem/C 中了若干trick之后才过... k个数的严格递增序列最小权值和就是${n*(n+1)/2}$,枚举这 ...

  7. Maximal GCD CodeForces - 803C (数论+思维优化)

    C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. AC日记——Maximal GCD codeforces 803c

    803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...

  9. Educational Codeforces Round 20 C. Maximal GCD

    C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. Linux安全学习

    安全游戏说明 游戏形式帮助初学者学习和实践网络安全,主要是Linux shell命令的练习. https://overthewire.org/wargames/ 二进制 灰帽黑客进阶秘籍之一--lin ...

  2. IDEA下同时使用Git和svn

    使用Git时将文件改成Git,Svn时改成svn 修改项目下.idea目录的vcs.xml配置文件. <?xml version="1.0" encoding="U ...

  3. Prometheus入门到放弃(3)之Grafana展示监控数据

    grafana我们这里采用docker方式部署 1.下载镜像 镜像官网地址:https://hub.docker.com/r/grafana/grafana/tags [root@prometheus ...

  4. SpringBoot(1)

    SpringBoot 8/2 CRUD 发送put请求修改数据有三个步骤: SpringMVC中配置HiddenHttpMethodFilter 页面上创建一个post请求(form标签只能写get和 ...

  5. python学习-68 反射

    反射 1.什么是反射? 反射的概念是有Smith在1982年首次提出的,主要是指程序可以访问.检测和修正它本身状态或行为的一种能力(自省). 2.以下四个方法可以实现自省 hasattr(object ...

  6. 使用ImagesPipeline时候报错为:ModuleNotFoundError: No module named 'scrapy.contrib'

    刚开始我是这样写的: 报错为: 哈哈,经过查阅资料,其实他是存在的,接下来修改如下: 经过运行结果如下: 问题解决,哈哈哈,搞定!!!!!!!!!!!!

  7. 存储库之MongoDB

    一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库(非关系型数据库) 1.易用性 MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库. 不采 ...

  8. 【转】基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

  9. [CodeChef-ANUDTQ] Dynamic Trees and Queries

    类似维护括号序列,给每个点建两个点,然后所有操作都能轻松支持了.注意sum和lastans是long long. #include<cstdio> #include<algorith ...

  10. git学习笔记 ---工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...