题目描述
龙龙有一块蛋糕,现在他想将蛋糕平均切成k块,分给他的k名hxd。但是不幸的是,因为龙龙不擅长切蛋糕,他每一次只能将一块蛋糕平均分成两份。例如,将一块大小为1的蛋糕分割成两块大小为1/2的蛋糕,将一块大小为1/2的蛋糕分割成两块大小为1/4的蛋糕,以此类推。由于龙龙手法有限,蛋糕的大小最小不能小于1/215 。
除此之外,为了更有仪式感,龙龙在将切好的蛋糕分给自己的hxd之前,要先将蛋糕打包。龙龙可以将切好的任意数量块蛋糕打包在一起,并交给他的一位hxd。需要注意的是,蛋糕在打包好后就不能再被切分了。为了公平起见,龙龙希望他的每一位hxd分得的蛋糕大小是相等的,即每位hxd分得的蛋糕的大小,与1/k的差距的绝对值不能大于1/210 。因为龙龙很懒,所以他希望蛋糕的总操作次数(每次打包或切分算一次操作)不超过6000。
现在龙龙想请你为他设计一种方案,使得他能够在6000次操作内,将蛋糕公平地分给他的hxd们。
输入描述:
输入在一行中给出1个不超过210的正整数k。
输出描述
在第一行输出一个不超过6000的正整数N,表示方案的操作次数。
接下来的N行描述该方案的N次操作。
对于第i次操作,若该操作要进行切分操作,则在该行行首输出1,之后输出要切分的蛋糕的大小。例如:若要将一块大小为1/21的蛋糕分割成两块大小为1/22的蛋糕,则在该行输出1 1;若要将一块大小为1/22的蛋糕分割成两块大小为1/23的蛋糕,则在该行输出1 2。初始时完整的蛋糕,大小视为1/20
若该操作要进行打包操作,则在该行行首输出2,之后输出一个正整数m,代表要打包的蛋糕块数。之后输出m个正整数,分别代表要打包的m快蛋糕的大小。例如:若要将一块大小为1/21 的蛋糕和一块大小为1/22的蛋糕进行打包,则在该行输出2 2 1 2;若要将两块大小为1/22 的蛋糕进行打包,则在该行输出2 2 2 2。
需要注意,一块蛋糕只有在被打包后才可以被龙龙送给他的hxd。所以你至少应进行k次打包操作。每份被包装的蛋糕的大小与1/k的差距的绝对值不应大于1/210 。
示例1
输入
2
输出
3
1 0
2 1 1
2 1 1
代码如下
#include<cstdio>
int K;
int main(){
scanf("%d",&K);
int ans=K+(1<<12)-1;
printf("%d\n",ans);
int cnt=0;
for(int i=0;i<12;i++){
for(int j=(1<<i);j>=1;j--){
printf("1 %d\n",i);
cnt++;
}
}
int tmp=(1<<12)/K,res=(1<<12)%K;
for(int i=1;i<=K;i++){
printf("2 ");
int ed=tmp;
if(res){
res--;
ed++;
}
printf("%d ",ed);
for(int i=1;i<=ed;i++){
printf("12%c",i==ed?'\n':' ');
}
}
return 0;
}