题目大意:
A和B玩游戏。游戏龟则很简单:设有n轮,则第i轮赢的人分数+i,输的不变(没有平局)。
给出两个分数
a
a
,,问是否有满足该分数的
n
n
,并输出满足该分数时,第一人赢了哪几局(输出一个方案即可)
0≤,
b
b
≤maxint
一眼马上就有二维背包的想法,不过。。
再仔细思考,会发现要满足条件,则
a+b=∑ni=1
a
+
b
=
∑
i
=
1
n
等差数列一套,就会发现
n
n
也没多大,也就级别
可接下来怎么搞?又一维背包?
然后,我们就要充分发挥作为信息学竞赛选手丰富的想(xia)象(cai)力——只要有
n
n
,就一定有解将
a
a
从后往前搞,当时就用
i
i
<script type="math/tex" id="MathJax-Element-1337">i</script>
。。然后,完美过了。。(太弱证不来,请大佬指教)
#include<cstdio>
#define LL long long
using namespace std;
LL a,b,c,ans,cnt,k[1000005];
void write(LL x){if(x<10) putchar(x+'0');else write(x/10),putchar(x%10+'0');}
LL check(LL x){
LL L=0,R=1e6,mid,now;
while(L<=R){
mid=L+R>>1;
now=(LL)(1+mid)*mid>>1;
if(now==x) return mid;
if(now<x) L=mid+1;else R=mid-1;
}
return -1;
}
int main(){
scanf("%lld%lld",&a,&b),c=a+b;
LL i=check(c);ans=i;
if(i<0){puts("No");return 0;}
while(a){if(a>=i) k[++cnt]=i,a-=i;i--;}
write(ans);
while(cnt) putchar(' '),write(k[cnt--]);putchar('\n');
return 0;
}