题意:给定n和k 判断是否能用一串长度为k的a来表示 a的和为n
且满足
a[i]<a[i+1]
a[i+1]<=2*a[i]
显然是等差和等比的关系
注意特判
8 3 和4 2 时无解
然后从后往前补即可

#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f ll n,k; const int N=1e6; ll a[N]; int main() { cin>>n>>k; ll temp=(1+k)*k/2; if(n<temp||n==8&&k==3||n==4&&k==2)return cout<<"NO",0; n-=temp; ll t=n/k; n-=t*k; rep(i,1,k) a[i]=i+t; while(n) { repp(i,k,2)//显然不可能再补1了 { if(a[i]+1<=a[i-1]*2)a[i]++,n--; else break; if(!n)break; } } cout<<"YES"<<endl; rep(i,1,k) printf(i==1?"%lld":" %lld",a[i]); return 0; }