QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#369391#8340. 3 SumGiga_Cronos#TL 299ms50700kbC++202.8kb2024-03-28 06:56:242024-03-28 06:56:24

Judging History

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

  • [2024-09-20 10:20:30]
  • hack成功,自动添加数据
  • (/hack/848)
  • [2024-03-28 06:56:24]
  • 评测
  • 测评结果:TL
  • 用时:299ms
  • 内存:50700kb
  • [2024-03-28 06:56:24]
  • 提交

answer

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

#define int long long
#define pb push_back
#define sz(x) (int)(x.size())
#define fs first
#define sc second
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define mid (L+R)/2

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
typedef __int128_t int128;


mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

int n,k;
const vi Mods={998244353,1'000'000'007,1'000'000'009,2'000'000'099};

struct Hash{
    vi H;
    Hash(){
        H.assign(4,0);
    }
    Hash(int a){
        H.assign(4,a);
    }
    Hash(vi F):H(F){}

    Hash operator -(Hash A){
        vi Nas(4);
        for(int i=0;i<4;i++){
            Nas[i]=(H[i]+2*Mods[i]-A.H[i])%Mods[i];
        }
        return Hash{Nas};
    }
    Hash operator +(Hash A){
        vi Nas(4);
        for(int i=0;i<4;i++){
            Nas[i]=(H[i]+A.H[i])%Mods[i];
        }
        return Hash{Nas};
    }
    Hash operator +(int a){
        vi Nas(4);
        for(int i=0;i<4;i++){
            Nas[i]=(H[i]+a)%Mods[i];
        }
        return Hash{Nas};
    }
    Hash operator *(int mul){
        vi Nas(4);
        for(int i=0;i<4;i++){
            Nas[i]=(H[i]*mul)%Mods[i];
        }
        return Hash{Nas};
    }
    bool operator ==(Hash A){
        for(int i=0;i<4;i++){
            if(A.H[i]!=H[i])return false;
        }
        return true;
    }
};


void problem(){
    cin>>n>>k;
    vector<Hash> A;
    for(int i=0;i<n;i++){
        string s;cin>>s;
        reverse(all(s));
        vi F(k);
        for(int j=0;j<sz(s);j++){
            F[j%k]+=s[j]-'0';
        }
        while(1){
           bool ok=true;
           for(int j=0;j<k;j++){
               int extra=F[j]/10;
               F[j]%=10;
               F[(j+1)%k]+=extra;
               if(extra)ok=false; 
           }
           if(ok)break;
        }
        Hash Num;
        for(int j=0;j<k;j++){
            Num=Num*10;
            Num=Num+F[j];
        }
        A.pb(Num);
    } 

    vector<Hash> Ans;
    Ans.pb(Hash());
    Hash Num;
    for(int i=0;i<k;i++){
        Num=Num*10;
        Num=Num+9;
    }
    Ans.pb(Num);
    Num=Num*2;
    Ans.pb(Num);
    map<vi,int> M;
    int ans=0;
    for(int i=0;i<n;i++){
        M[A[i].H]++;
        vector<Hash> Sum=Ans;
        for(int h=0;h<3;h++){
            Sum[h]=Sum[h]-A[i];
        }
        for(int j=i;j<n;j++){
            for(int h=0;h<3;h++){
                ans+=M[(Sum[h]-A[j]).H];
            }
        }
    }
    cout<<ans;

        
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int tc=1;
    //cin>>tc;
    while(tc--){
        problem();
        cout<<"\n";
    }

}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3784kb

input:

4 1
0
1
10
17

output:

3

result:

ok 1 number(s): "3"

Test #2:

score: 0
Accepted
time: 299ms
memory: 50700kb

input:

500 859
7118711592236878297922359501613604144948355616986970837340677671376753603836852811886591300370143151943368529129749813118476151865844255212534355441611481420938483178075143062691345257288242460282715389758789648541099090735875617822348551942134616963557723055980260082230902505269975518146286...

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: -100
Time Limit Exceeded

input:

500 17336
11871159223687829792235950161360414494835561698697083734067767137675360383685281188659130037014315194336852912974981311847615186584425521253435544161148142093848317807514306269134525728824246028271538975878964854109909073587561782234855194213461696355772305598026008223090250526997551814628...

output:


result: