暑假集训Day14 G (gcd 数学)

题目链接在这里:Problem - G - Codeforces

这题涉及到gcd,然后要把n拆分成k个数,这k个不同的数gcd最大。我们从一般的构造开始想,如果这k个数为1,2,...k,加起来比n大了,那一定就构造不出来。然后我们可以知道这个gcd一定是n的一个因数,所以我们可以枚举这个因数(这个操作在涉及gcd的问题中非常常见),剩下的就是1,2...k-1,n-sigma(1~k-1).

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 LL n,k,m;
 5 LL g,an;
 6 bool flag;
 7 inline LL mx(LL x,LL y){return x>y?x:y;}
 8 int main(){
 9     freopen ("g.in","r",stdin);
10     freopen ("g.out","w",stdout);
11     LL i,j,zt;
12     scanf("%lld%lld",&n,&k);
13     flag=false;
14     m=(1+k)*k/2;
15     an=0;
16     if (2*n/k<k+1){printf("-1");return 0;}
17     for (i=1;i*i<=n;i++){
18         if (n%i!=0)continue;
19         g=n/i;
20         if (i>=m) {an=g;break;}
21         if (g>=m) {an=i;}
22         else break;
23     }
24     //cout<<an<<endl;
25     if (an==0) printf("-1");
26     else{
27         for (i=1;i<k;i++) printf("%lld ",an*i);
28         printf("%lld",an*(k+n/an-m));
29     }
30     return 0;
31 }
未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
原文地址:https://www.cnblogs.com/keximeiruguo/p/15072961.html