链接
https://codeforces.com/problemset/problem/1157/D
题解
非寻常思路
需要灵光一现的感觉
这个上限增的比较快
注意到一个这样的事实:对序列
1
,
2
,
3
,
.
.
.
,
k
1,2,3,...,k
1,2,3,...,k同时加上一个常数,这个序列仍然合法
那我就同时加一个
⌊
n
−
k
(
k
+
1
)
2
k
⌋
\lfloor{\frac{n-\frac{k(k+1)}{2}}{k}}\rfloor
⌊kn−2k(k+1)⌋
然后把余数贪心地从后往前放就好了
代码
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long ll;
ll N, res, k, ans[maxn];
bool check()
{
ll i;
for(i=1;i<k;i++)if(ans[i+1]<=ans[i] or ans[i+1]>=2*ans[i])return false;
return true;
}
int main()
{
ll i;
cin>>N>>k;
res=N;
for(i=1;i<=k;i++)
{
ans[i]=i;
res-=i;
}
if(res<0)
{
printf("NO");
return 0;
}
auto tmp=res/k;
for(i=1;i<=k;i++)ans[i]+=tmp, res-=tmp;
for(i=k;i>=2;i--)
{
auto t=min(res,ans[i-1]*2-ans[i]);
ans[i]+=t;
res-=t;
}
if(res==0)
{
printf("YES\n");
for(i=1;i<=k;i++)printf("%lld ",ans[i]);
}
else
{
printf("NO\n");
}
return 0;
}