涂抹果酱
Posted wsy107316
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涂抹果酱相关的知识,希望对你有一定的参考价值。
涂抹果酱
题目分析:这道题跟上一道题有点像,不过这题有三种,所以想到三进制,而不是二进制了,然后把1,2,3化成0,1,2;然后,相应的比较部分换一下就好了
AC_Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int mod = 1e6; 5 const int maxn = 1e4 + 10; 6 7 int n, m, k; 8 int maxx, tot, sta[250], zk, pos, ans; 9 int f[10100][250]; 10 11 bool check(int x) { 12 int tmp = 0x3f; 13 for (int i = 1; i <= m; i++) { 14 if (tmp == x % 3) 15 return false; 16 tmp = x % 3; 17 x /= 3; 18 } 19 return true; 20 } 21 22 bool judge(int u, int v) { 23 for (int i = 1; i <= m; i++) { 24 if (u % 3 == v % 3) 25 return false; 26 u /= 3; 27 v /= 3; 28 } 29 return true; 30 } 31 32 int qpow(int a, int b) { 33 int res = 1; 34 while (b) { 35 if (b & 1) 36 res *= a; 37 a *= a; 38 b >>= 1; 39 } 40 return res; 41 } 42 43 int main() { 44 ios::sync_with_stdio(false); 45 cin >> n >> m >> k; 46 for (int i = 1; i <= m; i++) { 47 int x; 48 cin >> x; 49 zk = zk * 3 + (x - 1); 50 } 51 52 maxx = qpow(3, m); 53 for (int i = 0; i < maxx; i++) { 54 if (check(i)) 55 sta[++tot] = i; 56 } 57 for (int i = 1; i <= tot; i++) { 58 if (zk == sta[i]) { 59 pos = i; 60 break; 61 } 62 } 63 if (!pos) { //第k行本身就不符合条件 64 cout << "0" << ‘ ‘; 65 return 0; 66 } 67 for (int i = 1; i <= n; i++) { 68 if (i == k) { //此行状态已经固定 69 if (i == 1) 70 f[i][pos] = 1; 71 else { 72 for (int j = 1; j <= tot; j++) { 73 if (judge(sta[pos], sta[j])) { 74 f[i][pos] = (f[i][pos] + f[i - 1][j]) % mod; 75 } 76 } 77 } 78 } else { 79 for (int j = 1; j <= tot; j++) { //此行状态没有固定,所以多一重循环 80 if (i == 1) 81 f[i][j] = 1; 82 else { 83 for (int k = 1; k <= tot; k++) { 84 if (judge(sta[k], sta[j])) { 85 f[i][j] = (f[i][j] + f[i - 1][k]) % mod; 86 } 87 } 88 } 89 } 90 } 91 } 92 for (int i = 1; i <= tot; i++) ans = (ans + f[n][i]) % mod; 93 cout << ans << ‘ ‘; 94 return 0; 95 }
以上是关于涂抹果酱的主要内容,如果未能解决你的问题,请参考以下文章