QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#352233 | #8340. 3 Sum | 111445# | TL | 266ms | 3904kb | C++23 | 2.1kb | 2024-03-13 01:26:51 | 2024-03-13 01:26:52 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 500
#define B 6
int i,j,k,n,m,t;
const int M[21]={0,939235109,918177479,904775747,937509259,918480809,923802487,985385173,934431193,939365087,982767361,946533319,946423267,935536951,923956589,965647681,937270427,929863763,938269097,940115587,917694059};
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll mask = rng();
ll shift(ll x) {
x ^= mask;
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
x ^= mask;
return x;
}
struct SB{
int w[B+1],i;
void rd(string s){
for(i=1;i<=B;i++){
ll _w=0; int _M=M[i];
for(auto c:s){
_w=(_w*10+c-'0')%_M;
}
w[i]=_w;
}
}
ll get(){
ll res=0;
for(i=1;i<=B;i++)res=(shift(res)+w[i]);
return res;
}
}f[1005],f1;
int res=0;
ll w0,w1,w2,sb;
string s,ss;
string fuck(string s){
if(s=="0")return s;
int i,j,k,sz,n1,cur=0,it=m-1;
static int f[20005];
memset(f,0,m*4+50);
string ans;
while(s.size()>m){
k=s.size();
string s1=s.substr(k-m);
s.erase(k-m);
reverse(s1.begin(),s1.end());
//cout<<"CNMNMSL "<<s<<' '<<s1<<endl;
for(i=0;i<m;i++){
f[i]+=s1[i]-'0';
}
}
//cout<<"CNMNMSL "<<s<<endl;
reverse(s.begin(),s.end());
n1=s.size();
for(i=0;i<n1;i++){
f[i]+=s[i]-'0';
}
while(it>=0&&!f[it])it--;
if(it<0)return "0";
for(i=0;;i++){
if(i<=it)cur+=f[i];
//cout<<"NMSL "<<i<<' '<<f[i]<<' '<<cur<<endl;
if(i>it&&!cur)break;
ans+=char(cur%10+'0'); cur/=10;
}
reverse(ans.begin(),ans.end());
//cout<<"nmsl "<<ans<<endl;
return ans;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m;
ss=string(m,'9');
for(i=1;i<=n;i++){
cin>>s;
while(s.size()>m)s=fuck(s);
if(s==ss)s="0";
//cout<<"nmsl "<<s<<endl;
f[i].rd(s);
}
w0=f1.get();
f1.rd(ss); w1=f1.get();
for(i=1;i<=B;i++){
f1.w[i]=(f1.w[i]+f1.w[i])%M[i];
}
w2=f1.get();
for(i=1;i<=n;i++)for(j=i;j<=n;j++)for(k=j;k<=n;k++){
for(t=1;t<=B;t++){
f1.w[t]=(0ll+f[i].w[t]+f[j].w[t]+f[k].w[t])%M[t];
}
sb=f1.get();
if(sb==w0||sb==w1||sb==w2)res++;
}
cout<<res;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3700kb
input:
4 1 0 1 10 17
output:
3
result:
ok 1 number(s): "3"
Test #2:
score: 0
Accepted
time: 266ms
memory: 3904kb
input:
500 859 7118711592236878297922359501613604144948355616986970837340677671376753603836852811886591300370143151943368529129749813118476151865844255212534355441611481420938483178075143062691345257288242460282715389758789648541099090735875617822348551942134616963557723055980260082230902505269975518146286...
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: -100
Time Limit Exceeded
input:
500 17336 11871159223687829792235950161360414494835561698697083734067767137675360383685281188659130037014315194336852912974981311847615186584425521253435544161148142093848317807514306269134525728824246028271538975878964854109909073587561782234855194213461696355772305598026008223090250526997551814628...