天天看点

Luogu P1146题解

题目描述:

按照数学方法,每次翻

(n - 1)

个硬币相当于是每次翻一个硬币

证明:

定义翻某n-1个为A类操作。

定义B操作,是把所有的硬币全部翻面。

定义C操作,是翻某一个硬币。

题主的问题是若干次A操作之后能否达到某个状态,而一个A操作等同于做一次B一次C,注意到B和C操作是可交换的,因此可以理解为先做若干次数的C操作,然后再做相同次数的B操作。

而做若干次C操作相当于一个一个硬币地翻,所以第i次翻转就是翻转除了第i个硬币以外的所有硬币。

所以只需要翻硬币翻n次,第i次翻硬币翻除了第i个硬币外

(n - 1)

个硬币。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 104;
int a[maxn] = {0};
int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            if(j != i) a[j] = !a[j];
            else continue;
        }
        if(i == 1) cout << n << endl;
        for(int i = 1;i < n;i++) cout << a[i];
        cout << a[n] << endl;
    }
    // for(int i = 1;i < n;i++) cout << a[i] << ' ';
    // cout << a[n] << endl;
    return 0;
}
           

继续阅读