Skip to content

Commit 1a2b738

Browse files
committed
divisible por 3
1 parent e5aa64b commit 1a2b738

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

Free/divisiblePor3.cpp

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#include <bits/stdc++.h>
2+
#define all(x) x.begin(),x.end()
3+
#define msg(str,str2) cout << str << str2<< endl
4+
using namespace std;
5+
6+
using ll = long long;
7+
using ld = long double;
8+
using uint = unsigned int;
9+
using ull = unsigned long long;
10+
template<typename T>
11+
using pair2 = pair<T, T>;
12+
using pii = pair<int, int>;
13+
using pli = pair<ll, int>;
14+
using pll = pair<ll, ll>;
15+
16+
#define pb push_back
17+
#define mp make_pair
18+
19+
int gcd(int a,int b){
20+
if(a%b==0) return b;
21+
else return gcd(b,a%b);
22+
}
23+
24+
clock_t startTime;
25+
double getCurrentTime() {
26+
return (double)(clock() - startTime) / CLOCKS_PER_SEC;
27+
}
28+
29+
void solve(){
30+
int n; cin>>n;
31+
string s; cin>>s;
32+
vector<int> vec(n);
33+
for(int e = 0 ; e < n; e++){
34+
vec[e] = s[e] - '0';
35+
}
36+
37+
// for(int e = 0 ; e <n; e++){
38+
// cout << vec[e]<< " ";
39+
// }cout << endl;
40+
41+
// prefix sum
42+
for(int e = 1 ; e <n; e++){
43+
vec[e] = vec[e-1]+ vec[e];
44+
}
45+
46+
// for(int e = 0 ; e <n; e++){
47+
// cout << vec[e]<< " ";
48+
// }cout << endl;
49+
vector<int> modulo3(n);
50+
for(int e = 0 ;e < n ; e++){
51+
modulo3[e] = vec[e]%3;
52+
}
53+
vector<int> ceros(n),unos(n),dos(n);
54+
//ceros
55+
if(modulo3[0] == 0) ceros[0] = 1;
56+
else ceros[0] = 0;
57+
for(int e = 1 ; e < n; e++){
58+
if(modulo3[e] == 0){
59+
ceros[e] = ceros[e-1] +1;
60+
}else{
61+
ceros[e] = ceros[e-1] + 0;
62+
}
63+
}
64+
//unos
65+
if(modulo3[0] == 1) unos[0] = 1;
66+
else unos[0] = 0;
67+
for(int e = 1 ; e < n; e++){
68+
if(modulo3[e] == 1){
69+
unos[e] = unos[e-1] +1;
70+
}else{
71+
unos[e] = unos[e-1] + 0;
72+
}
73+
}
74+
//dos
75+
if(modulo3[0] == 2) dos[0] = 1;
76+
else dos[0] = 0;
77+
for(int e = 1 ; e < n; e++){
78+
if(modulo3[e] == 2){
79+
dos[e] = dos[e-1] +1;
80+
}else{
81+
dos[e] = dos[e-1] + 0;
82+
}
83+
}
84+
// cout << "prints:" << endl;
85+
// for(int e = 0 ; e < n; e++){
86+
// cout << ceros[e] << " ";
87+
// }cout << endl;
88+
// for(int e = 0 ; e < n; e++){
89+
// cout << unos[e] << " ";
90+
// }cout << endl;
91+
92+
// for(int e = 0 ; e < n; e++){
93+
// cout << dos[e] << " ";
94+
// }cout << endl;
95+
96+
int cont = 0;
97+
for(int e = 1 ;e < n ; e++){
98+
if(vec[e]%3 == 0){
99+
cont += ceros[e-1];
100+
}else if(vec[e]%3==1){
101+
cont += unos[e-1];
102+
}else{
103+
// vec[e]%3==2
104+
cont += dos[e-1];
105+
}
106+
}
107+
for(int e = 0;e < n ; e++){
108+
if(vec[e]%3==0) cont++;
109+
}
110+
cout << cont << endl;
111+
112+
113+
}
114+
115+
int main(){
116+
ios_base::sync_with_stdio(false);
117+
cin.tie(0);
118+
int t; cin>>t;
119+
while(t--)solve();
120+
return 0;
121+
}

0 commit comments

Comments
 (0)