题目链接在这里: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 }