枚举。
枚举$gcd$,然后计算剩下的那个数能不能分成$k$个递增的数。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <algorithm> using namespace std; long long b[100010]; long long ans[200010]; int sz; long long n,k; void init() { for(long long i=1;i*i<=n;i++) { if(n%i!=0) continue; b[sz++] =i; if(i!=n/i) b[sz++] =n/i; } } int main() { scanf("%lld%lld",&n,&k); init(); sort(b,b+sz); if(k>200000) { printf("-1 "); return 0; } int suc=0; for(int i=sz-1;i>=0;i--) { long long sum = n/b[i]; long long p = (1+k)*k/2; if(p>sum) continue; for(int j=1;j<=k;j++) { ans[j] = j; sum = sum-ans[j]; } ans[k]+=sum; for(int j=1;j<=k;j++) { ans[j]=ans[j]*b[i]; } suc=1; break; } if(suc==0) { printf("-1 "); } else { for(long long i=1;i<=k;i++) { printf("%lld",ans[i]); if(i<k) printf(" "); else printf(" "); } } return 0; }