QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#386891#8330. Count off 3Mysterious_CatRE 0ms0kbC++175.8kb2024-04-11 21:07:012024-04-11 21:07:02

Judging History

你现在查看的是最新测评结果

  • [2024-04-17 10:54:24]
  • hack成功,自动添加数据
  • (/hack/598)
  • [2024-04-16 16:08:54]
  • hack成功,自动添加数据
  • (/hack/597)
  • [2024-04-11 21:07:02]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-04-11 21:07:01]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

const int N = 1e4 + 5;
const int mod = 1e9 + 7;

int n, ans, sum[4][2], pw[N][7], dp[N][8][8][8][2];
string s;

int main() {
    freopen("c.in", "r", stdin);
    freopen("c.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0);
    for (int j = 1; j <= 6; j++) {
        pw[0][j] = 1;
    }
    dp[0][0][0][0][1] = 1;
    dp[0][1][1][1][0] = 1;
    for (int i = 1; i <= (int)1e4; i++) {
        for (int j = 1; j <= 6; j++) {
            pw[i][j] = 1ll * pw[i - 1][j] * j % 7;
        }
        for (int s1 = 0; s1 < 7; s1++) {
            for (int s2 = 0; s2 < 7; s2++) {
                for (int s3 = 0; s3 < 7; s3++) {
                    dp[i][s1][s2][s3][i & 1] = (dp[i - 1][s1][s2][s3][i & 1] + dp[i - 1][(s1 - pw[i][1] + 7) % 7][(s2 - pw[i][2] + 7) % 7][(s3 - pw[i][3] + 7) % 7][i & 1]) % mod;
                    dp[i][s1][s2][s3][i & 1 ^ 1] = dp[i - 1][s1][s2][s3][i & 1 ^ 1];
                }
            }
        }
    }
    for (int i = 0; i <= 1e4; i++) {
        for (int s1 = 0; s1 < 7; s1++) {
            for (int s2 = 0; s2 <= 7; s2++) {
                for (int s3 = 0; s3 <= 7; s3++) {
                    dp[i][7][s2][s3][i & 1] = (dp[i][7][s2][s3][i & 1] + dp[i][s1][s2][s3][i & 1]) % mod;
                    dp[i][7][s2][s3][i & 1 ^ 1] = (dp[i][7][s2][s3][i & 1 ^ 1] + dp[i][s1][s2][s3][i & 1 ^ 1]) % mod;
                }
            }
        }
        for (int s1 = 0; s1 <= 7; s1++) {
            for (int s2 = 0; s2 < 7; s2++) {
                for (int s3 = 0; s3 <= 7; s3++) {
                    dp[i][s1][7][s3][i & 1] = (dp[i][s1][7][s3][i & 1] + dp[i][s1][s2][s3][i & 1]) % mod;
                    dp[i][s1][7][s3][i & 1 ^ 1] = (dp[i][s1][7][s3][i & 1 ^ 1] + dp[i][s1][s2][s3][i & 1 ^ 1]) % mod;                   
                }
            }
        }
        for (int s1 = 0; s1 <= 7; s1++) {
            for (int s2 = 0; s2 <= 7; s2++) {
                for (int s3 = 0; s3 < 7; s3++) {
                    dp[i][s1][s2][7][i & 1] = (dp[i][s1][s2][7][i & 1] + dp[i][s1][s2][s3][i & 1]) % mod;
                    dp[i][s1][s2][7][i & 1 ^ 1] = (dp[i][s1][s2][7][i & 1 ^ 1] + dp[i][s1][s2][s3][i & 1 ^ 1]) % mod;
                }
            }
        }
    }
    int T;
    cin >> T;
    while (T--) {
        cin >> s;
        n = s.size();
        ans = 0;
        reverse(s.begin(), s.end());
        memset(sum, 0, sizeof(sum));
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] == '1') {
                if (i > 0) {
                    int ans_ = ans;
                    for (int s1 = 0; s1 < 7; s1++) {
                        for (int s2 = 0; s2 < 7; s2++) {
                            for (int s3 = 0; s3 < 7; s3++) {
                                int res = 0;
                                for (int t1 = 0; t1 < 3; t1++) {
                                    for (int t2 = 0; t2 < 3; t2++) {
                                        for (int t3 = 0; t3 < 3; t3++) {
                                            int v = -1;
                                            int s1_ = 7;
                                            if (t1 == 0) v *= -1;
                                            if (t1 == 1) s1_ = (21 - sum[1][0] - sum[1][1] - s1) % 7;
                                            if (t1 == 2) {
                                                s1_ = (sum[1][0] + s1 - sum[1][1] + 7) % 7;
                                                if ((sum[1][0] + sum[1][1] + s1 + s1_) % 7 == 0) {
                                                    continue;
                                                }
                                            }
                                            int s2_ = 7;
                                            if (t2 == 0) v *= -1;
                                            if (t2 == 1) s2_ = (21 - sum[2][0] - sum[2][1] - s2) % 7;
                                            if (t2 == 2) {
                                                s2_ = (sum[2][0] + s2 - sum[2][1] + 7) % 7;
                                                if ((sum[2][0] + sum[2][1] + s2 + s2_) % 7 == 0) {
                                                    continue;
                                                }
                                            }
                                            int s3_ = 7;
                                            if (t3 == 0) v *= -1;
                                            if (t3 == 1) s3_ = (21 - sum[3][0] - sum[3][1] - s3) % 7;
                                            if (t3 == 2) {
                                                s3_ = (sum[3][0] + s3 - sum[3][1] + 7) % 7;
                                                if ((sum[3][0] + sum[3][1] + s3 + s3_) % 7 == 0) {
                                                    continue;
                                                }
                                            }
                                            res = ((res + v * dp[i - 1][s1_][s2_][s3_][1]) % mod + mod) % mod;
                                        }
                                    }
                                }
                                ans = (ans + 1ll * res * dp[i - 1][s1][s2][s3][0] % mod) % mod;
                            }
                        }
                    }
                }
                for (int j = 1; j <= 3; j++) {
                    sum[j][i & 1] = (sum[j][i & 1] + pw[i][j]) % 7;
                }
                if (i == 0) {
                    bool flag = 1;
                    for (int j = 1; j <= 3; j++) {
                        flag &= (sum[j][0] + sum[j][1]) % 7 && (sum[j][0] - sum[j][1] + 7) % 7;
                    }
                    ans += flag;
                }
            }
        }
        cout << ans << '\n';
    }

    return 0;
}

详细

Test #1:

score: 0
Dangerous Syscalls

input:

5
1
1010
110101
1000111000
101101001000

output:


result: