luogu1146 硬幣翻轉

2021-08-15 19:41:07 字數 1134 閱讀 2654

時空限制    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枚硬幣成為一次操作 輸入格式 乙個自...