CF803C Maximal GCD 讲解
题目
相信很多人是被数据范围劝退的
数据范围为:
你可能觉得输出
但是我们思考一下:
都知道高斯的求和公式吧:
因为
上述行为是为了防止爆 long long, 再次特判, 若
然后我们设序列的第
所以, 我们需要找出
下一步我们枚举
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100005],summ,maxn;
bool cmp(long long x,long long y){ return x>y; }
void work(){
for(long long i=1;i*i<=n;i++)
if(n%i==0)
if(i*i==n) a[++summ]=i;
else{
a[++summ]=i;
a[++summ]=n/i;
}
return;
}
int main(){
cin>>n>>k;
if(k>=150000){
cout<<-1;
return 0;
}
if((1+k)*k/2>n){
cout<<-1;
return 0;
}
work();
sort(a+1,a+summ+1,cmp);
for(int i=1;i<=summ;i++)
if(n*2/k/(k+1)>=a[i]){
maxn=a[i];
break;
}
for(int i=1;i<k;i++){
cout<<i*maxn<<' ';
n-=i*maxn;
}
cout<<n;
return 0;
}