QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#280339#7789. Outro: True Love Waitsucup-team088#WA 5ms12132kbC++179.1kb2023-12-09 15:16:362023-12-09 15:16:36

Judging History

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

  • [2023-12-09 15:16:36]
  • 评测
  • 测评结果:WA
  • 用时:5ms
  • 内存:12132kb
  • [2023-12-09 15:16:36]
  • 提交

answer

#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<cassert>
#include<complex>
#include<numeric>
#include<array>
#include<chrono>
using namespace std;

//#define int long long
typedef long long ll;

typedef unsigned long long ul;
typedef unsigned int ui;
//ll mod = 1;
//constexpr ll mod = 998244353;
constexpr ll mod = 1000000007;
const int mod17 = 1000000007;
const ll INF = (ll)mod17 * mod17;
typedef pair<int, int>P;

#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
#define all(v) (v).begin(),(v).end()
typedef pair<ll, ll> LP;

using ld = double;
typedef pair<ld, ld> LDP;
const ld eps = 1e-10;
const ld pi = acosl(-1.0);

template<typename T>
void chmin(T& a, T b) {
    a = min(a, b);
}
template<typename T>
void chmax(T& a, T b) {
    a = max(a, b);
}
template<typename T>
vector<T> vmerge(vector<T>& a, vector<T>& b) {
    vector<T> res;
    int ida = 0, idb = 0;
    while (ida < a.size() || idb < b.size()) {
        if (idb == b.size()) {
            res.push_back(a[ida]); ida++;
        }
        else if (ida == a.size()) {
            res.push_back(b[idb]); idb++;
        }
        else {
            if (a[ida] < b[idb]) {
                res.push_back(a[ida]); ida++;
            }
            else {
                res.push_back(b[idb]); idb++;
            }
        }
    }
    return res;
}
template<typename T>
void cinarray(vector<T>& v) {
    rep(i, v.size())cin >> v[i];
}
template<typename T>
void coutarray(vector<T>& v) {
    rep(i, v.size()) {
        if (i > 0)cout << " "; cout << v[i];
    }
    cout << "\n";
}
ll mod_pow(ll x, ll n, ll m = mod) {
    if (n < 0) {
        ll res = mod_pow(x, -n, m);
        return mod_pow(res, m - 2, m);
    }
    if (abs(x) >= m)x %= m;
    if (x < 0)x += m;
    //if (x == 0)return 0;
    ll res = 1;
    while (n) {
        if (n & 1)res = res * x % m;
        x = x * x % m; n >>= 1;
    }
    return res;
}
//mod should be <2^31
struct modint {
    int n;
    modint() :n(0) { ; }
    modint(ll m) {
        if (m < 0 || mod <= m) {
            m %= mod; if (m < 0)m += mod;
        }
        n = m;
    }
    operator int() { return n; }
};
bool operator==(modint a, modint b) { return a.n == b.n; }
bool operator<(modint a, modint b) { return a.n < b.n; }
modint operator+=(modint& a, modint b) { a.n += b.n; if (a.n >= mod)a.n -= (int)mod; return a; }
modint operator-=(modint& a, modint b) { a.n -= b.n; if (a.n < 0)a.n += (int)mod; return a; }
modint operator*=(modint& a, modint b) { a.n = ((ll)a.n * b.n) % mod; return a; }
modint operator+(modint a, modint b) { return a += b; }
modint operator-(modint a, modint b) { return a -= b; }
modint operator*(modint a, modint b) { return a *= b; }
modint operator^(modint a, ll n) {
    if (n == 0)return modint(1);
    modint res = (a * a) ^ (n / 2);
    if (n % 2)res = res * a;
    return res;
}

ll inv(ll a, ll p) {
    return (a == 1 ? 1 : (1 - p * inv(p % a, a)) / a + p);
}
modint operator/(modint a, modint b) { return a * modint(inv(b, mod)); }
modint operator/=(modint& a, modint b) { a = a / b; return a; }
const int max_n = 1 << 20;
modint fact[max_n], factinv[max_n];
void init_f() {
    fact[0] = modint(1);
    for (int i = 0; i < max_n - 1; i++) {
        fact[i + 1] = fact[i] * modint(i + 1);
    }
    factinv[max_n - 1] = modint(1) / fact[max_n - 1];
    for (int i = max_n - 2; i >= 0; i--) {
        factinv[i] = factinv[i + 1] * modint(i + 1);
    }
}
modint comb(int a, int b) {
    if (a < 0 || b < 0 || a < b)return 0;
    return fact[a] * factinv[b] * factinv[a - b];
}
modint combP(int a, int b) {
    if (a < 0 || b < 0 || a < b)return 0;
    return fact[a] * factinv[a - b];
}

ll gcd(ll a, ll b) {
    a = abs(a); b = abs(b);
    if (a < b)swap(a, b);
    while (b) {
        ll r = a % b; a = b; b = r;
    }
    return a;
}
template<typename T>
void addv(vector<T>& v, int loc, T val) {
    if (loc >= v.size())v.resize(loc + 1, 0);
    v[loc] += val;
}
/*const int mn = 2000005;
bool isp[mn];
vector<int> ps;
void init() {
    fill(isp + 2, isp + mn, true);
    for (int i = 2; i < mn; i++) {
        if (!isp[i])continue;
        ps.push_back(i);
        for (int j = 2 * i; j < mn; j += i) {
            isp[j] = false;
        }
    }
}*/

//[,val)
template<typename T>
auto prev_itr(set<T>& st, T val) {
    auto res = st.lower_bound(val);
    if (res == st.begin())return st.end();
    res--; return res;
}

//[val,)
template<typename T>
auto next_itr(set<T>& st, T val) {
    auto res = st.lower_bound(val);
    return res;
}
using mP = pair<modint, modint>;
mP operator+(mP a, mP b) {
    return { a.first + b.first,a.second + b.second };
}
mP operator+=(mP& a, mP b) {
    a = a + b; return a;
}
mP operator-(mP a, mP b) {
    return { a.first - b.first,a.second - b.second };
}
mP operator-=(mP& a, mP b) {
    a = a - b; return a;
}
LP operator+(LP a, LP b) {
    return { a.first + b.first,a.second + b.second };
}
LP operator+=(LP& a, LP b) {
    a = a + b; return a;
}
LP operator-(LP a, LP b) {
    return { a.first - b.first,a.second - b.second };
}
LP operator-=(LP& a, LP b) {
    a = a - b; return a;
}

mt19937 mt(time(0));

const string drul = "DRUL";
string senw = "SENW";
//DRUL,or SENW
//int dx[4] = { 1,0,-1,0 };
//int dy[4] = { 0,1,0,-1 };

//------------------------------------


//typedef vector<vector<modint>> mat;
//typedef vector<modint> vec;
//mat mtmul(mat& A, mat& B) {
//    mat C(A.size(), vec(B[0].size()));
//    rep(i, (int)A.size()) {
//        rep(k, (int)B.size()) {
//            rep(j, (int)B[0].size()) {
//                C[i][j] += A[i][k] * B[k][j];
//            }
//        }
//    }
//    return C;
//}
//mat mtpow(mat A, ll n) {
//    mat B(A.size(), vec(A.size()));
//    rep(i, (int)A.size()) {
//        B[i][i] = 1;
//    }
//    while (n > 0) {
//        if (n & (ll)1)B = mtmul(B, A);
//        A = mtmul(A, A);
//        n >>= 1;
//    }
//    return B;
//}
//
//mat mem[30];
//mat A;
//void init() {
//    A = { {4,4},{0,1} };
//}

void vout(int x,int sz=10) {
    while (sz--) {
        cout << x % 2; x /= 2;
    }
    cout << "\n";
}
modint calc0(int k) {
    k--;
    modint val = mod_pow(4, k);
    val -= 1;
    val *= 4;
    val /= 3;
    return val;
}
int calc(string s, int k) {
    int c1 = 0;
    rep(i, s.size())if (s[i] == '1') {
        c1++;
    }
    if (c1 == 0) {
        return calc0(k);
    }
    vector<modint> le(s.size() + 1);
    le[0] = 1;
    rep1(i, s.size()) {
        le[i] = le[i - 1] * (modint)2;
        if (i % 2 == 0)le[i] += 1;
    }
    modint res = 0;
    per(i, s.size()) {
        if (c1 == 0) {
            int sup = (i + 3) / 2;
            if (k <= sup) {
                res += calc0(k);
                break;
            }
            else return -1;
        }
        if (s[i] == '1') {
            //cout << "hello\n";
            res += le[i];
            s[i] = '0';
            c1--;
            if (i % 2) {
                if (s[i - 1] == '0') {
                    c1++; s[i - 1] = '1';
                }
                else{
                    c1--; s[i - 1] = '0';
                }
            }
        }
    }
    return res;
}
string trans(int cur) {
    string res;
    while (cur > 0) {
        res.push_back('0' + (cur % 2)); cur /= 2;
    }
    return res;
}
void expr() {
    set<P> st;
    int cur = 0;
    map<int, int> mp;
    rep(t, 1000) {
        //if (cur == 0)cout << _<<"\n";
        vout(cur); mp[cur]++;
        {
            int c = calc(trans(cur), mp[cur]);
            //cout << trans(cur) << "\n";
            cout << c << "\n";
            assert(c == t);
        }
        bool upd = false;
        rep(i, 20) {
            int to = cur ^ (1 << i);
            if (st.count(minmax(cur, to)))continue;
            st.insert(minmax(cur, to));
            upd = true;
            cur = to;
            break;
        }
        assert(upd);
    }
}
void solve() {
    string s, t; cin >> s >> t;
    int k; cin >> k;
    int sz = max(s.size(), t.size());
    reverse(all(s));
    reverse(all(t));
    s.resize(sz, '0');
    t.resize(sz, '0');
    rep(i, s.size()) {
        if (t[i] == '1') {
            s[i] = '0' + '1' - s[i];
        }
    }
    cout << calc(s, k) << "\n";
}



signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    //cout << fixed<<setprecision(10);
    //init_f();
    //init();
    //while(true)
    //expr();
    int t; cin >> t; rep(i, t)
    solve();
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 5ms
memory: 11828kb

input:

4
1 10 1
1 10 2
100 0 2
11 11 3

output:

2
-1
9
20

result:

ok 4 number(s): "2 -1 9 20"

Test #2:

score: 0
Accepted
time: 4ms
memory: 11892kb

input:

1
0 0 1

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: 0
Accepted
time: 5ms
memory: 12132kb

input:

100
110111 11111 1
10110 101101 1
11010 111111 1
100110 1 1
10010 11010 1
1100 10111 1
100100 111110 1
101110 101100 1
1011 10110 1
110100 1110 1
11010 11000 1
11110 1000 1
111000 11101 1
110 1001 1
101010 11000 1
10 111110 1
110001 101000 1
1010 1000 1
10101 11 1
111011 11010 1
110001 100000 1
1100...

output:

78
59
69
70
15
38
39
3
32
60
3
29
69
12
45
52
37
3
29
64
22
39
54
69
65
27
33
76
34
18
57
13
81
15
23
70
69
36
18
23
29
42
69
54
6
0
63
3
29
15
10
16
80
24
37
59
71
13
23
31
21
34
23
48
21
47
7
44
42
3
37
75
59
29
55
39
29
28
29
70
55
16
54
47
24
18
79
60
8
26
64
58
32
6
8
37
2
68
42
44

result:

ok 100 numbers

Test #4:

score: -100
Wrong Answer
time: 4ms
memory: 12056kb

input:

100
10011111 111 2
1011101100 1000000100 1
100011111 1001001111 1
1001100101 1100100001 1
10101000 10000100 1
1011110101 100011101 1
110100001 111011010 1
1101001100 1111101101 1
1001101 11011010 1
1101110110 1101011000 1
110011001 1100001111 2
1001111001 1011001111 1
1001110 1101110100 2
1110110100...

output:

295
248
788
431
73
930
144
319
283
76
1307
305
742
895
86
770
312
293
1293
433
1179
0
884
963
1215
576
469
1132
499
811
864
949
1322
406
526
862
1156
447
1203
1238
873
1016
18
1131
1108
438
134
359
80
740
1057
752
31
950
1093
1261
650
235
996
876
504
925
1344
450
1010
273
407
1144
1041
717
945
164
-...

result:

wrong answer 11th numbers differ - expected: '-1', found: '1307'