智乃的原始部落
题号:NC272308
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

有这样一个经典故事,一位探险家到某个原始部落找一位向导带路。由于原式部落没有货币,所以探险家准备使用一块长度为5的金条支付这位向导5天的工资。

双方出于对对方的不信任,想到了一个方法可以避免某一方提前跑路。探险家将金条切成长度分别为1,2,2的三部分。

第一天结束后,探险家将长度为1的金条直接支付给向导。

第二天结束后,探险家将长度为2的金条支付给向导,并向他取回长度为1的金条。

第三天结束后,探险家将长度为1的金条直接支付给向导。

第四天结束后,探险家将另一块长度为2的金条支付给向导,并向他取回长度为1的金条。

第五天结束后,探险家将长度为1的金条直接支付给向导。

这样就构建了一套货币找零系统,使探险家能够在每一天的时候,“恰好”支付向导1个单位的金条。

现在有两块金条,长度分别为N,M,他准备雇佣这位向导N+M天,假设探险家切割一次长度为N的金条需要花费a的代价,切割一次长度为M的金条需要花费b的代价。

现在智乃想要知道,探险家通过切割两块金条构建货币找零系统使得他能够每一天``恰好''支付向导1个单位的金条的最小代价的具体方案,你可以给出任意一种。

输入描述:

第一行输入两个正整数N,M(1\leq N,M \leq 10^7)表示两块金条的长度。

接下来一行输入两个整数a,b(1\leq a,b \leq 10^9),表示切割两块金条的代价分别是多少。

输出描述:

第一行输出三个整数ans,l_a,l_b分别表示最小代价,第一块金条的切割次数,第二块金条的切割次数。

第二行输出一行l_a+1个正整数,表示切割后第一块金条每一部分的长度。

第三行输出一行l_b+1个正整数,表示切割后第二块金条每一部分的长度。

你可以输出任意满足条件的方案,但是需要保证切割每一段的长度大于0,例如不能出现长度为5的金条,切2刀分成1,4,0,只能切1刀分成1,4两部分。
示例1

输入

复制
16 1
5 1000000000

输出

复制
15 3 0
2 4 8 2
1
示例2

输入

复制
1 1
1 1

输出

复制
0 0 0
1
1
示例3

输入

复制
10000000 10000000
1000000000 1

输出

复制
23 0 23
10000000
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 1611393