QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#349411 | #8340. 3 Sum | ucup-team1055# | TL | 134ms | 6096kb | C++20 | 2.9kb | 2024-03-10 01:46:16 | 2024-03-10 01:46:18 |
Judging History
answer
#pragma once
#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++)
#define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--)
#define all(v) v.begin(), v.end()
using ll = long long;
using ld = long double;
using ull = unsigned long long;
template <typename T> bool chmin(T &a, const T &b) {
if (a <= b) return false;
a = b;
return true;
}
template <typename T> bool chmax(T &a, const T &b) {
if (a >= b) return false;
a = b;
return true;
}
using namespace std;
// isprime
bool isprime(ll n){
if (n == 1) return false;
for (ll i = 2; i * i <= n; i++){
if (n % i == 0) return false;
}
return true;
}
ll mod_pow(ll x, ll m, int P){
ll ret = 1;
ll tmp = x;
while (m > 0){
if (m&1){
ret = ret * tmp % P;
}
m >>= 1;
tmp = tmp * tmp % P;
}
return ret;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, k; cin >> n >> k;
vector<string> s(n);
rep(i,0,n){
cin >> s[i];
}
auto naosu = [&](string t) -> vector<int> {
int pr = (int)t.size();
int pl = (int)t.size() - k;
vector<int> ret(k, 0);
while(pr > 0){
vector<int> tmp(k, 0);
rep(i,max(0,pl),pr){
tmp[i-pl] = t[i] - '0';
}
int over = 0;
int gogo = 0;
rrep(i,0,k){
gogo = ret[i] + tmp[i] + over;
if (gogo >= 10){
gogo -= 10;
over = 1;
}else{
over = 0;
}
ret[i] = gogo;
}
if (over == 1){
rrep(i,0,k){
gogo = ret[i] + over;
if (gogo >= 10){
gogo -= 10;
over = 1;
}else{
over = 0;
}
ret[i] = gogo;
}
}
pr -= k;
pl -= k;
}
return ret;
};
vector<vector<int>> gar;
rep(i,0,n){
gar.push_back(naosu(s[i]));
/*
rep(j,0,k){
cout << gar[i][j];
}
cout << endl;
*/
}
random_device seed_gen;
mt19937 engine(seed_gen());
uniform_int_distribution<int> dist((int)5e8, (int)1e9);
const int numpy = 9;
vector<int> pls(numpy);
rep(i,0,numpy){
do {
pls[i] = dist(engine);
}while(!isprime(pls[i]));
}
vector<vector<ll>> hashl(n, vector<ll>(numpy));
rep(i,0,n){
rep(p,0,numpy){
ll tmp = 0;
rep(j,0,k){
tmp = tmp * 10 + gar[i][j];
tmp %= pls[p];
}
hashl[i][p] = tmp;
}
}
vector miru(4, vector<ll>(numpy));
rep(i,0,numpy){
miru[1][i] = (mod_pow(10, k, pls[i]) + 2 * pls[i] - 1) % pls[i];
miru[2][i] = miru[1][i] * 2 % pls[i];
miru[3][i] = miru[1][i] * 3 % pls[i];
}
ll cnt = 0;
rep(j,0,n){
map<vector<int>,int> mp;
rep(i,0,j+1){
vector<int> arg(numpy);
rep(p,0,numpy){
ll t = hashl[i][p] + hashl[j][p];
t %= pls[p];
arg[p] = t;
}
mp[arg]++;
}
rep(k,j,n){
rep(d,0,4){
vector<int> arg(numpy);
rep(p,0,numpy){
ll t = hashl[k][p];
arg[p] = miru[d][p] - t;
}
cnt += mp[arg];
}
}
}
cout << cnt << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3832kb
input:
4 1 0 1 10 17
output:
3
result:
ok 1 number(s): "3"
Test #2:
score: 0
Accepted
time: 134ms
memory: 6096kb
input:
500 859 7118711592236878297922359501613604144948355616986970837340677671376753603836852811886591300370143151943368529129749813118476151865844255212534355441611481420938483178075143062691345257288242460282715389758789648541099090735875617822348551942134616963557723055980260082230902505269975518146286...
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: -100
Time Limit Exceeded
input:
500 17336 11871159223687829792235950161360414494835561698697083734067767137675360383685281188659130037014315194336852912974981311847615186584425521253435544161148142093848317807514306269134525728824246028271538975878964854109909073587561782234855194213461696355772305598026008223090250526997551814628...
output:
0