Educational Codeforces Round 20 C. Maximal GCD

原创 2018年04月17日 18:18:18

1.题目链接

http://codeforces.com/contest/803/problem/C

2.题面

C. 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

3.题意

就是给你一个n,让你分解成k个数之和,并保证这k个数的GCD最大。

4.思路

这个题只要稍微想一下,就可以知道这k个数都可以化成GCD(ALL k)*k[i]的形式。所以这个GCD一定是n的因子。我们只需要枚举n的因子,判断n/该因子的结果是否大于(1+2+....k),然后只需要把最后一个k变大点就可以了。

注意到n的范围为1e10,所以sqrt(n)的复杂度是可行的。n为1e10,所以大于1e6的k都是无解的。先加一个剪枝以免爆ll

5.代码实现

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include <time.h>
#include<string.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;
typedef pair <db, db> pdd;

const int maxn = 2005;
const int Mod=1000000007;
const int INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const double e=2.718281828459045235360287471352662;
const db PI = acos(-1);
const db ERR = 1e-10;

#define Se second
#define Fi first
#define pb push_back
ll n,k,flag;
vector<ll> v;
int main()
{
    //ios::sync_with_stdio(false);
    //freopen("a.txt","r",stdin);
    //freopen("b.txt","w",stdout);
    cin>>n>>k;
    if(k>1000000)
    {
        cout<<-1<<endl;
        return 0;
    }
    ll pp=((1+k)*k)/2;
    if(n<pp)
    {
        cout<<-1<<endl;
        return 0;
    }
    for(ll i=1;i*i<=n;i++)
    {
        if(n%i==0)
        {
            v.pb(i);
            v.pb(n/i);
        }
    }
    int cnt=v.size();
    sort(v.begin(),v.end());
    for(int i=cnt-1;i>=0;i--)
    {
        if(n/v[i]>=pp)
        {
            for(ll j=1;j<=k-1;j++)
                printf("%lld ",j*v[i]);
            printf("%lld ",(n/v[i]-(k*(k-1))/2)*v[i]);
            return 0;
        }
    }
    cout<<-1<<endl;
    //cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    return 0;
}

6.反思

注意一上来对数据范围的剪枝,很重要。

iOS多线程-NSThread | NSOperation | GCD

本课程由扣丁学堂教学总监郭宏志老师讲授,主要学习iOS开发中多线程这一专题。内容主要包括:多线程简介和nsthread、Operation Object、Grand Gentral Dispatch等知识。
  • 2015年11月25日 16:35

Educational Codeforces Round 38 题解

总结 A由于阅读水平不够看了好久才看懂。这次的edu比之前我做的一场难了,D其实很简单但我往另一个方向想了,所以没有做出来,倒是E很快就切了。 这是最终成绩: 题解 A. Word...
  • qq_33229466
  • qq_33229466
  • 2018-02-18 12:51:47
  • 175

Educational Codeforces Round 35 (Rated for Div. 2) A——C

A. Nearest Minimums time limit per test 2 seconds memory limit per test 256 megabytes input st...
  • sinat_37668729
  • sinat_37668729
  • 2017-12-29 00:06:09
  • 205

Educational Codeforces Round 22 C. The Tag Game(思维 搜索)

题意:给你一个无向有根树,根节点为1,有两个人,A在节点1,B在节点X,AB轮流走,B先走,每次可以原地不动或是向相邻节点移动一次。A想最快抓到B,B想最慢被抓到, 问什么时候A抓到B。 ...
  • CillyB
  • CillyB
  • 2017-06-06 00:58:36
  • 453

Educational Codeforces Round 38 (Rated for Div. 2) B. Run For Your Prize

B. Run For Your PrizeYou and your friend are participating in a TV show &quot;Run For Your Prize&quo...
  • s540239976
  • s540239976
  • 2018-02-17 13:35:37
  • 214

Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence (构造 贪心)

1000个数,每个数不超过1e6,让你构造一个不超过4000的数列,使得对于新数列,任意区间内的数求GCD都出现在这1000个数中。...
  • hmc0411
  • hmc0411
  • 2017-11-20 13:19:26
  • 439

Codeforces Round #447 (Div. 2) C. Marco and GCD Sequence 构造

http://codeforces.com/contest/894/problem/C 题意:给你一个严格升序排列的S序列,让你找回他原来的序列。 做法:这也太坑了,鬼鬼。一开始以为就是原序列...
  • qq_36553623
  • qq_36553623
  • 2017-11-20 09:42:12
  • 246

解题报告:Educational Codeforces Round 24 D,E,F

D、题目链接 题意: 给定一个长度为n的序列,给定一个数a,询问是否存在数b满足从前往后遍历序列,数b出现的次数始终大于等于数a出现的次数。 思路: 把每两个数a之间看做一个筛选阶段,每次筛选掉之...
  • qq_32570675
  • qq_32570675
  • 2017-07-01 14:07:43
  • 287

Educational Codeforces Round 42 E 贪心

题目链接 题意: 数轴上有三种类型的点:B型点、R型点、P型点。 你可以连接任意两个点,连接的代价是两个点的距离,即坐标之差。 而最终希望达到的条件是: 如果去除所有B型点,R型点和P型...
  • WuBaizhe
  • WuBaizhe
  • 2018-04-11 11:57:41
  • 56

Codeforces803C Maximal GCD

二分+贪心
  • FSAHFGSADHSAKNDAS
  • FSAHFGSADHSAKNDAS
  • 2017-04-30 17:39:51
  • 585
收藏助手
不良信息举报
您举报文章:Educational Codeforces Round 20 C. Maximal GCD
举报原因:
原因补充:

(最多只允许输入30个字)