1. 程式人生 > 其它 >第八屆“圖靈杯”NEUQ-ACM程式設計競賽個人賽——A題 切蛋糕

第八屆“圖靈杯”NEUQ-ACM程式設計競賽個人賽——A題 切蛋糕

技術標籤:大雜燴

題目描述

龍龍有一塊蛋糕,現在他想將蛋糕平均切成k塊,分給他的k名hxd。但是不幸的是,因為龍龍不擅長切蛋糕,他每一次只能將一塊蛋糕平均分成兩份。例如,將一塊大小為1的蛋糕分割成兩塊大小為1/2的蛋糕,將一塊大小為1/2的蛋糕分割成兩塊大小為1/4的蛋糕,以此類推。由於龍龍手法有限,蛋糕的大小最小不能小於 1 / 2 15 1/{2^{15}} 1/215

除此之外,為了更有儀式感,龍龍在將切好的蛋糕分給自己的hxd之前,要先將蛋糕打包。龍龍可以將切好的任意數量塊蛋糕打包在一起,並交給他的一位hxd。需要注意的是,蛋糕在打包好後就不能再被切分了。為了公平起見,龍龍希望他的每一位hxd分得的蛋糕大小是相等的,即每位hxd分得的蛋糕的大小,與1/k的差距的絕對值不能大於 1 / 2 10 1/{2^{10}}

1/210 。因為龍龍很懶,所以他希望蛋糕的總操作次數(每次打包或切分算一次操作)不超過6000。

現在龍龍想請你為他設計一種方案,使得他能夠在6000次操作內,將蛋糕公平地分給他的hxd們。

輸入描述

輸入在一行中給出1個不超過 2 10 2^{10} 210 的正整數k。

輸出描述

在第一行輸出一個不超過6000的正整數N,表示方案的操作次數。

接下來的N行描述該方案的N次操作。

對於第i次操作,若該操作要進行切分操作,則在該行行首輸出1,之後輸出要切分的蛋糕的大小。例如:若要將一塊大小為 1 / 2 1 1/{2^1} 1/21 的蛋糕分割成兩塊大小為 1 / 2 2 1/{2^2} 1/22的蛋糕,則在該行輸出1 1;若要將一塊大小為 1 / 2 2 1/{2^2}

1/22的蛋糕分割成兩塊大小為 1 / 2 3 1/{2^3} 1/23的蛋糕,則在該行輸出1 2。初始時完整的蛋糕,大小視為 1 / 2 0 1/{2^0} 1/20

若該操作要進行打包操作,則在該行行首輸出2,之後輸出一個正整數m,代表要打包的蛋糕塊數。之後輸出m個正整數,分別代表要打包的m快蛋糕的大小。例如:若要將一塊大小為 1 / 2 1 1/{2^1} 1/21的蛋糕和一塊大小為 1 / 2 2 1/{2^2} 1/22的蛋糕進行打包,則在該行輸出2 2 1 2;若要將兩塊大小為 1 / 2 2 1/{2^2} 1/22的蛋糕進行打包,則在該行輸出2 2 2 2。

需要注意,一塊蛋糕只有在被打包後才可以被龍龍送給他的hxd。所以你至少應進行k次打包操作。每份被包裝的蛋糕的大小與1/k的差距的絕對值不應大於 1 / 2 10 1/{2^{10}}

1/210

示例

輸入

2
輸出

3
1 0
2 1 1
2 1 1

AC的C++程式碼

#include<iostream>
#define ll long long;
using namespace std;

int main()
{
    int k;
	cin>>k;
	printf("%d\n",1023+k);
	for(int i=0;i<=9;i++)
        for(int j=1;j<=1<<i;j++)
            printf("1 %d\n",i);
    for(int i=1;i<=k;i++)
    {
        printf("2 %d",1024/k);
        for(int j=1;j<=1024/k;j++)
            printf(" %d",10);
        printf("\n");
    }
	return 0;
}