QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#441980#8340. 3 Sumucup-team045#AC ✓81ms3976kbC++205.6kb2024-06-15 01:12:352024-10-13 18:54:04

Judging History

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

  • [2024-10-13 18:54:04]
  • 管理员手动重测本题所有得分≥97分的提交记录
  • 测评结果:AC
  • 用时:81ms
  • 内存:3976kb
  • [2024-09-20 10:20:30]
  • hack成功,自动添加数据
  • (/hack/848)
  • [2024-06-15 01:12:35]
  • 评测
  • 测评结果:100
  • 用时:82ms
  • 内存:3912kb
  • [2024-06-15 01:12:35]
  • 提交

answer

#include<iostream>
#include<cstring>
#include<vector>
#include<random>
#include<array>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
using namespace std;
using LL = long long;

int qpow(int a, int b, int mod){
    int res = 1;
    while (b){
        if (b & 1) res = 1LL * res * a % mod;
        a = 1LL * a * a % mod;
        b >>= 1;
    }
    return res;
}

const int BASE = 1e9, WIDTH = 9;
using BigInt = vector<int>;

BigInt operator+(const BigInt &a, const BigInt &b){
    BigInt c(max(a.size(), b.size()) + 1);
    for(int i = 0; i < (int)a.size(); i++){
        c[i] += a[i];
    }
    for(int i = 0; i < (int)b.size(); i++){
        c[i] += b[i];
    }
    for(int i = 0; i < (int)c.size(); i++){
        if (c[i] >= BASE){
            c[i + 1] += 1;
            c[i] -= BASE;
        }
    }
    while(c.size() > 1 && c.back() == 0){
        c.pop_back();
    }
    return c;
}

BigInt operator-(const BigInt &a, const BigInt &b){
    BigInt c(max(a.size(), b.size()));
    for(int i = 0; i < (int)a.size(); i++){
        c[i] += a[i];
    }
    for(int i = 0; i < (int)b.size(); i++){
        c[i] -= b[i];
    }
    for(int i = 0; i < (int)c.size(); i++){
        if (c[i] < 0){
            c[i + 1] -= 1;
            c[i] += BASE;
        }
    }
    while(c.size() > 1 && c.back() == 0){
        c.pop_back();
    }
    return c;
}

BigInt operator*(const BigInt &a, int b){
    BigInt c(a.size() + 1);
    long long t = 0;
    for(int i = 0; i < (int)a.size(); i++){
        t += 1LL * a[i] * b;
        c[i] = t % BASE;
        t /= BASE;
    }
    c.back() = t;
    while(c.size() > 1 && c.back() == 0){
        c.pop_back();
    }
    return c;
}

pair<BigInt, long long> operator/(const BigInt &a, int b){
    BigInt c;
    c.reserve(a.size());
    long long r = 0;
    for(int i = (int)a.size() - 1; i >= 0; i--){
        r = r * BASE + a[i];
        c.push_back(r / b);
        r %= b;
    }
    reverse(c.begin(), c.end());
    while(c.size() > 1 && c.back() == 0){
        c.pop_back();
    }
    return {c, r};
}

bool operator<(const BigInt &a, const BigInt &b){
    if (a.size() != b.size()){
        return a.size() < b.size();
    }
    for(int i = (int)a.size() - 1; i >= 0; i--){
        if (a[i] != b[i]){
            return a[i] < b[i];
        }
    }
    return false;
}

BigInt str2int(const string &s){
    BigInt a;
    a.reserve(s.size() / WIDTH + 1);
    int base = 1, val = 0;
    for(int i = (int)s.size() - 1; i >= 0; i--){
        val += (s[i] - '0') * base;
        base *= 10;
        if (base == BASE){
            a.push_back(val);
            base = 1, val = 0;
        }
    }
    if (a.empty() || val) a.push_back(val);
    return a;
}

ostream &operator<<(ostream &os, const BigInt &A) { 
    os << A.back();
    for(int i = (int)A.size() - 2; i >= 0; i--)
        os << setw(WIDTH) << setfill('0') << A[i];
    return os;
}

int main(){

#ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    const int N = 1e9, M = 5;
    mt19937_64 rnd(14124152352365);
    array<int, M> p;
    uniform_int_distribution<int> dist(N / 2, N);
    for(int i = 0; i < M; i++){
        p[i] = dist(rnd);
    }

    auto add = [&](const array<int, M> &a, const array<int, M> &b){
        array<int, M> c{};
        for(int i = 0; i < M; i++){
            c[i] = (a[i] + b[i]);
            if (c[i] >= p[i]) c[i] -= p[i];
        }
        return c;
    };

    auto sub = [&](const array<int, M> &a, const array<int, M> &b){
        array<int, M> c{};
        for(int i = 0; i < M; i++){
            c[i] = (a[i] - b[i]);
            if (c[i] < 0) c[i] += p[i];
        }
        return c;
    };

    int n, k;
    cin >> n >> k;
    BigInt MOD = str2int(string(k, '9'));
    array<int, M> target[4];
    int base[M];
    for(int i = 0; i < M; i++){
        base[i] = qpow(10, k, p[i]) - 1;
        if (base[i] < 0) base[i] += p[i];
    }
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < M; j++){
            target[i][j] = 1LL * base[j] * i % p[j];
        }
    }
    vector<array<int, M> > q(n);
    if (k <= 9){
        int t = 1;
        for(int i = 0; i < k; i++) t *= 10;
        t -= 1;
        for(int i = 0; i < n; i++){
            string s;
            cin >> s;
            int a = 0;
            for(auto c : s){
                a = (1LL * a * 10 + c - '0') % t;
            }
            for(int j = 0; j < M; j++){
                q[i][j] = a % p[j];
            }
        } 
    }
    else{
        for(int i = 0; i < n; i++){
            string s;
            cin >> s;
            BigInt a{0};
            for(int j = s.size() - 1; j >= 0; j -= k){
                int r = j, l = max(0, r - k + 1);
                a = a + str2int(s.substr(l, r - l + 1));
                if (a.size() > k){
                    a = a - MOD;
                }
            }
            for(int j = 0; j < M; j++){
                for(int k = (int)a.size() - 1; k >= 0; k--){
                    q[i][j] = (1LL * q[i][j] * BASE + a[k]) % p[j];
                }
            }
        } 
    }
    int ans = 0;
    map<array<int, M>, int> mp;
    for(int i = 0; i < n; i++){
        mp[q[i]] += 1;
        for(int j = i; j <= n; j++){
            for(int k = 0; k < 4; k++){
                auto t = sub(target[k], add(q[i], q[j]));
                if (mp.contains(t)){
                    ans += mp[t];
                }
            }
        }
    }
    cout << ans << '\n';

}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3668kb

input:

4 1
0
1
10
17

output:

3

result:

ok 1 number(s): "3"

Test #2:

score: 0
Accepted
time: 23ms
memory: 3932kb

input:

500 859
7118711592236878297922359501613604144948355616986970837340677671376753603836852811886591300370143151943368529129749813118476151865844255212534355441611481420938483178075143062691345257288242460282715389758789648541099090735875617822348551942134616963557723055980260082230902505269975518146286...

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: 0
Accepted
time: 75ms
memory: 3736kb

input:

500 17336
11871159223687829792235950161360414494835561698697083734067767137675360383685281188659130037014315194336852912974981311847615186584425521253435544161148142093848317807514306269134525728824246028271538975878964854109909073587561782234855194213461696355772305598026008223090250526997551814628...

output:

0

result:

ok 1 number(s): "0"

Test #4:

score: 0
Accepted
time: 79ms
memory: 3632kb

input:

500 1
751324443898124078584847834484321089092662321556147445230263526014359393841194947303407593948729802551881289193716611867931891257925091769456350249725997883453296895094445731130479434019358742162771547784250401546380268386074363779242500860317042151185119666027858022664683818314351285215150806...

output:

2327631

result:

ok 1 number(s): "2327631"

Test #5:

score: 0
Accepted
time: 81ms
memory: 3780kb

input:

500 2
408542968136435277974575411503179002415404345446801430469044749372949272333801248935236224652806667129749035002588943020176263162139056819871274824302889304493205266143688886696157147111754418731401856424401766968832165255416237731963027205324149660112574729610391396555581935236134531799950318...

output:

212002

result:

ok 1 number(s): "212002"

Test #6:

score: 0
Accepted
time: 64ms
memory: 3976kb

input:

500 11500
75411775796562109942642493394321873284995260953010112281856775261847503626737348402159485133662757032091519863427156582689971229143089317472838196453888261138079171290535429921921548971897026706656838415620603757605079012541561774699628665865662183868374645956694140356716037674688084770628...

output:

7675

result:

ok 1 number(s): "7675"

Test #7:

score: 0
Accepted
time: 61ms
memory: 3752kb

input:

500 11500
85355036663164764459816544518601485185320972076300982726542821424439713703229669576802138231401047471351087455159512255765325323540671792953715169122669767368905391325060775725733157611188832204902997772518104188947349204726490597030311894441123834099315122116302203972018409854605418988681...

output:

1070

result:

ok 1 number(s): "1070"

Test #8:

score: 0
Accepted
time: 0ms
memory: 3656kb

input:

1 11500
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999...

output:

1

result:

ok 1 number(s): "1"

Extra Test:

score: 0
Extra Test Passed