蜡烛

题目传送门

你谷题目传送门

思路:可以打表找一下规律

结论:

1.不管时啥咒语念了俩遍就会啥用没有

2.念了顺序不一样只要咒语一样得出的结果还是一样

3.发现不管xx是啥都能转换成x2x \le 2的状态(因为根据规律1和抽屉原理会消掉一些)

所以可以自己算一下当x2x \le 2时的状态有哪些

AC code(禁止ctj,有防伪):

//2023tyoi0292
#include <iostream>
#include <cstdio>
#define ZPB 0
using namespace std;

int check[9][7] = {};//ZPB为了不让你ctj把这部分删了(坏笑😄😄😄) 

int n, x, a[105], b[105];

void solve(int w[9]) {
	bool zpb = true;
	for(int k = 1; k <= w[0]; k++) {
		bool flag2 = false;
		for(int i = 1; i <= a[0]; i++) {
			if(!check[w[k]][a[i] % 6]) {
				flag2 = 1;
				break;
			}
		}
		if(flag2) continue;
		for(int i = 1; i <= b[0]; i++) {
			if(check[w[k]][b[i] % 6]) {
				flag2 = 1;
				break;
			}
		}	
		if(flag2) continue;
		zpb = false;
		for(int i = 1; i <= n; i++) cout << check[w[k]][i % 6];
		cout << endl;
	}
	if(zpb) cout << "!ASH!" << endl;
}
signed main() {
	cin >> n >> x;
	int y;
	while(cin >> y) {
		if(y == 0) break;
		a[++a[0]] = y;
	}
	while(cin >> y) {
		if(y == 0) break;
		b[++b[0]] = y;
	}
	if(x == 0) {
		int w[9] = {1, 8};
		solve(w);
	}
	if(x == 1) {
		int w[9] = {4, 1, 3, 4, 6};
		solve(w);
	}
	if(x == 2) {
		int w[9] = {7, 1, 2, 3, 5, 6, 7, 8};
		solve(w);
	}
	if(x > 2) {
		int w[9] = {8, 1, 2, 3, 4, 5, 6, 7, 8};
		solve(w);
	}
	return ZPB;
}















好心的ZPB还是不忍心,于是把check放了了回来(还不去点赞!!!):

int check[9][7] = {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1}, {1, 0, 1, 0, 1, 0}, {1, 0, 1, 1, 0, 1}, {0, 1, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 1}, {1, 1, 1, 0, 0, 0}, {1, 1, 1, 1, 1, 1}