[CSP-S 2023] 密码锁

发布时间 2023-12-13 17:49:38作者: Light_starup

[CSP-S 2023] 密码锁

考场上我跟个 \(somebody\) 一样,一看就想:一眼乘法原理,乱搞写一下就出来了。

当时我还算了一下暴力好像也不会超时,结果,每天在 yz 日以继日的颓废考试经验,我断定 CSP-S 是不会考这么 \(!\) 复杂的题目的,结果暴力出奇迹,就是枚举模拟。

考试后,一看wc枚举,我断定我就是 sb

思路

暴力出省一

结论是如果所枚举的密码,和任何一个给定密码相同那么不可累加,变一个密码很好判断,只要看枚举的与给定是否只有一个不同。两个呢?发现变两个时,两个值 $a_i \equiv a_{i + 1} \operatorname{mod}10 $ 那么就可以写出一下代码

#include <bits/stdc++.h>
using namespace std;
int a[10][7], sum[7];
int n;
bool check(int _1, int _2, int _3, int _4, int _5){
	for(int i = 1; i <= n; i++){
		if(_1 == a[i][1] && _2 == a[i][2] && _3 == a[i][3] && _4 == a[i][4] && _5 == a[i][5])return 0;
		sum[1] = (a[i][1] - _1 + 10) % 10, sum[2] = (a[i][2] - _2 + 10) % 10, sum[3] = (a[i][3] - _3 + 10) % 10, sum[4] = (a[i][4] - _4 + 10) % 10, sum[5] = (a[i][5] - _5 + 10) % 10;
		int cnt = 0;
		for(int j = 1; j <= 5; j++){
			if(sum[j] == 0)continue;
			cnt++;
			if(cnt >= 3)return 0;
			if(cnt == 2){
				if(sum[j] != sum[j - 1])return 0;
			}
		}
	}
	return 1;
}

int main() {
	
	cin >> n;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= 5; j++)
			cin >> a[i][j];
	long long ans = 0;
	for(int _1 = 0; _1 <= 9; _1++){
		for(int _2 = 0; _2 <= 9; _2++){
			for(int _3 = 0; _3 <= 9; _3++){
				for(int _4 = 0; _4 <= 9; _4++){
					for(int _5 = 0; _5 <= 9; _5++){
					    ans += check(_1, _2, _3, _4, _5);
					}
				}
			}
		}
	}
	cout << ans;
  return 0;
}