题意:
给定n,k,要求构造一个长度为k的严格递增的序列,满足序列的和为n且gcd最大。
如果无解输出-1,否则输出一种方案。
数据范围:n,k<=1e10
解法:
假设gcd为x,那么每个数都是x的倍数.
如果序列是3x,4x,5x,
实际上和x,4x,7x一样满足要求.
这么做是为了令最小的数恰好为gcd,
考虑枚举x,那么n=p*x(n能被x整除,p是一个正整数),且p>=k*(k+1)/2,
发现x只需要枚举n的因子即可.
复杂度是O(sq)的
观察到k*(k+1)/2可能爆longlong,考虑如何解决:
发现n最大10e10,且1e6*(1e6+1)/2>1e10(序列为1,2,3...1e6时)
显然当k>=1e6的时候肯定是无解的,直接特判掉,
剩下的部分就不会爆了.
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n,k;cin>>n>>k;
if(k>1e6){
cout<<-1<<endl;
return 0;
}
int mi=k*(k+1)/2;
int ans=0;
for(int i=1;i*i<=n;i++){
if(n%i==0){
if(n/i>=mi){
ans=max(ans,i);
}
if(i>=mi){
ans=max(ans,n/i);
}
}
}
if(!ans){
cout<<-1<<endl;
return 0;
}
int p=n/ans;
for(int i=1;i<=k-1;i++){
cout<<i*ans<<' ';
p-=i;
}
cout<<p*ans<<endl;
return 0;
}