時空限制 1000ms/128mb
在桌面上有一排硬幣,共n枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n-1枚硬幣(正面向上的被翻轉為反面向上,反之亦然)。求乙個最短的操作序列(將每次翻轉n-1枚硬幣成為一次操作)。
輸入格式:
輸入只有一行,包含乙個自然數n(n為不大於100的偶數)。
輸出格式:
輸出檔案的第一行包含乙個整數s,表示最少需要的操作次數。接下來的s行每行分別表示每次操作後桌上硬幣的狀態(一行包含n個整數(0或1),表示每個硬幣的狀態:0――正面向上,和1――反面向上,不允許出現多餘空格)。
對於有多種操作方案的情況,則只需字典序最小輸出一種。
輸入樣例#1:
輸出樣例#1:4
0111
1100
0001
1111
硬幣數目是偶數,最初是正面朝上,目標是反面朝上,每次要翻n-1枚,如何翻???
硬幣只要翻轉次數是奇數次就保證最後是反面朝上的。要達到目標,每一枚硬幣翻轉都要是奇數次才行,總次數為 奇*偶==偶。下面我們來計算硬幣翻轉次數(1枚翻轉一次算一次)
第1次翻轉 n-1次 奇數 (不行)
第2次翻轉 2(n-1)次 偶數 2(n-1)除以n 除不盡(不行)
第3次翻轉 3(n-1)次 奇數 (不行)
第4次翻轉 4(n-1)次 奇數 4(n-1)除以n 除不盡(不行)
第i次翻轉 i(n-1)次 i(n-1)/n
要想得到最小次數 i(n-1)/n 第一次能整除就是我們的解。n-1 與 n一定不是因子,所以,只有i/n能整除才行,i的最小值n,n就是最小操作次數。
n枚硬幣翻轉n次,1--n剛好n次,那麼第i次翻轉時,第i枚硬幣不動,其他n-1枚翻轉,就達到目標(每枚硬幣翻轉n-1次)。
#includeusing namespace std;
bool a[105]=; //false表示正面向上
int main()
cout<} return 0;
}
洛谷1146 硬幣翻轉
在桌面上有一排硬幣,共nn枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 乙個自然數nn nn為不大於100100的偶數 第一行包含乙個整數ss,表示...
luogu P1146 硬幣翻轉
在桌面上有一排硬幣,共n枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 輸入格式 輸入只有一行,包含乙個自然數n n為不大於100的偶數 輸出格式 輸出檔案...
洛谷P1146 硬幣翻轉
時間限制 1.00s 記憶體限制 125.00mb 題目描述在桌面上有一排硬幣,共nn枚,每一枚硬幣均為正面朝上。現在要把所有的硬幣翻轉成反面朝上,規則是每次可翻轉任意n 1n 1枚硬幣 正面向上的被翻轉為反面向上,反之亦然 求乙個最短的操作序列 將每次翻轉n 1枚硬幣成為一次操作 輸入格式 乙個自...