Skip to content

Commit 05ba0e5

Browse files
committed
Compfest 2021 Final - Online Mirror
1 parent 40c873c commit 05ba0e5

File tree

9 files changed

+650
-0
lines changed

9 files changed

+650
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Coded by Luqman
3+
*/
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
const int N = 1e6 + 6;
10+
11+
bool cmp(pair<string, int> a, pair<string, int> b) {
12+
for (int i = 0; i < (int) a.first.size(); i++) {
13+
if (a.first[i] != b.first[i]) {
14+
if (i % 2 == 0) {
15+
return a.first[i] < b.first[i];
16+
} else {
17+
return a.first[i] > b.first[i];
18+
}
19+
}
20+
}
21+
return a < b;
22+
}
23+
24+
char s[N];
25+
26+
int main() {
27+
int n, m;
28+
cin >> n >> m;
29+
vector<pair<string, int>> a;
30+
for (int i = 0; i < n; i++) {
31+
string s;
32+
cin >> s;
33+
a.emplace_back(s, i);
34+
}
35+
sort(a.begin(), a.end(), cmp);
36+
for (int i = 0; i < n; i++) {
37+
printf("%d%c", a[i].second + 1, i == n - 1? '\n' : ' ');
38+
}
39+
40+
return 0;
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Coded by Luqman
3+
*/
4+
5+
#include <bits/stdc++.h>
6+
7+
using namespace std;
8+
9+
const int N = 20;
10+
const int REM = 25;
11+
12+
long long dp[10][10][REM]; // digit - X - rem
13+
char s[N];
14+
15+
void add(long long& at, long long val) {
16+
at += val;
17+
}
18+
19+
int main() {
20+
scanf("%s", s + 1);
21+
int n = strlen(s + 1);
22+
for (int x = 0; x < 10; x++) {
23+
dp[0][x][0] = 1;
24+
}
25+
for (int i = 1; i <= n; i++) {
26+
for (int x = 0; x < 10; x++) {
27+
if (s[i] == 'X') {
28+
for (int rem = 0; rem < REM; rem++) {
29+
if (i == 1 && x == 0 && n > 1) continue;
30+
add(dp[i][x][(rem * 10 + x) % REM], dp[i-1][x][rem]);
31+
}
32+
} else if (s[i] == '_') {
33+
for (int rem = 0; rem < REM; rem++) {
34+
for (int fill = 0; fill < 10; fill++) {
35+
if (i == 1 && fill == 0 && n > 1) continue;
36+
add(dp[i][x][(rem * 10 + fill) % REM], dp[i-1][x][rem]);
37+
}
38+
}
39+
} else {
40+
int c = s[i] - '0';
41+
if (i == 1 && c == 0 && n > 1) continue;
42+
for (int rem = 0; rem < REM; rem++) {
43+
add(dp[i][x][(rem * 10 + c) % REM], dp[i-1][x][rem]);
44+
}
45+
}
46+
}
47+
}
48+
int has_x = 0;
49+
for (int i = 1; i <= n; i++) if (s[i] == 'X') has_x = 1;
50+
long long ans = 0;
51+
if (has_x) {
52+
for (int x = 0; x < 10; x++) {
53+
ans += dp[n][x][0];
54+
}
55+
} else {
56+
ans += dp[n][0][0];
57+
}
58+
cout << ans << endl;
59+
return 0;
60+
}
+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 2e5 + 5, mod = 1e9 + 7;
6+
7+
vector<pair<int, int>> g[N];
8+
int a[N], sz[N], big[N], die[N];
9+
10+
void get_sz(int v, int par = -1) {
11+
sz[v] = 1;
12+
big[v] = -1;
13+
for (auto & e : g[v]) {
14+
int u = e.first;
15+
if (u == par || die[u]) continue;
16+
get_sz(u, v);
17+
if (big[v] == -1 || sz[u] > sz[big[v]])
18+
big[v] = u;
19+
sz[v] += sz[u];
20+
}
21+
}
22+
23+
void add(long long & var, long long val) {
24+
var += val;
25+
if (var >= mod)
26+
var -= mod;
27+
else if (var < 0)
28+
var += mod;
29+
}
30+
31+
long long ans = 0;
32+
struct Fenwick {
33+
long long sum[N];
34+
Fenwick() {
35+
memset(sum, 0, sizeof sum);
36+
}
37+
long long get(int x) {
38+
long long ret = 0;
39+
for (++x; x; x -= x&-x)
40+
add(ret, sum[x]);
41+
return ret;
42+
}
43+
void update(int x, int v) {
44+
for (++x; x < N; x += x&-x)
45+
add(sum[x], v);
46+
}
47+
};
48+
49+
Fenwick sum[2];
50+
Fenwick cnt[2];
51+
52+
int mul = 1;
53+
54+
void dfs(int v, int par, long long cost, int change, int col) {
55+
int last = col ^ (change & 1);
56+
add(cost, a[v]);
57+
58+
sum[col].update(change, mul * cost);
59+
cnt[col].update(change, mul);
60+
61+
for (auto & e : g[v]) {
62+
int u = e.first;
63+
if (u == par || die[u]) continue;
64+
dfs(u, v, cost, change + (last != e.second), col);
65+
}
66+
}
67+
68+
int n, k;
69+
70+
void dfs2(int v, int par, long long cost, int change, int col) {
71+
if (change > k) return;
72+
int last = col ^ (change & 1);
73+
add(cost, a[v]);
74+
75+
ans = (ans + 1LL * cnt[col].get(k - change) * cost + 1LL * sum[col].get(k - change));
76+
if (change + 1 <= k)
77+
ans = (ans + 1LL * cnt[col^1].get(k - change - 1) * cost + 1LL * sum[col^1].get(k - change - 1));
78+
79+
for (auto & e : g[v]) {
80+
int u = e.first;
81+
if (u == par || die[u]) continue;
82+
dfs2(u, v, cost, change + (last != e.second), col);
83+
}
84+
}
85+
86+
void centroid(int v) {
87+
get_sz(v);
88+
int tot = sz[v];
89+
while (big[v] != -1 && sz[big[v]] * 2 >= tot)
90+
v = big[v];
91+
92+
for (auto & e : g[v]) {
93+
int u = e.first;
94+
if (die[u]) continue;
95+
96+
dfs2(u, v, 0, 0, e.second);
97+
98+
mul = 1;
99+
dfs(u, v, a[v], 0, e.second);
100+
}
101+
102+
ans = (ans + a[v]) % mod;
103+
for (int i = 0; i < 2; ++i) {
104+
ans = (ans + 1LL * sum[i].get(k)) % mod;
105+
}
106+
107+
for (auto & e : g[v]) {
108+
int u = e.first;
109+
if (die[u]) continue;
110+
mul = -1;
111+
dfs(u, v, a[v], 0, e.second);
112+
}
113+
114+
die[v] = 1;
115+
116+
for (auto & e : g[v]) {
117+
int u = e.first;
118+
if (die[u]) continue;
119+
centroid(u);
120+
}
121+
}
122+
123+
int main() {
124+
scanf("%d %d", &n, &k);
125+
for (int i = 0; i < n; ++i) {
126+
scanf("%d", a+i);
127+
}
128+
for (int i = 0; i < n-1; ++i) {
129+
int u, v, w;
130+
scanf("%d %d %d", &u, &v, &w);
131+
--u, --v;
132+
g[u].emplace_back(v, w);
133+
g[v].emplace_back(u, w);
134+
}
135+
centroid(0);
136+
ans %= mod;
137+
if (ans < 0)
138+
ans += mod;
139+
printf("%lld\n", ans);
140+
return 0;
141+
}
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 1e5 + 5, mod = 1e9 + 7, MAGIC = 50;
6+
7+
vector<int> fac[N];
8+
vector<int> elem[N];
9+
long long g[N];
10+
int cnt[N];
11+
12+
long long solve(vector<int> & val) {
13+
vector<int> all;
14+
for (int x : val) {
15+
all.push_back(x);
16+
for (int z : fac[x])
17+
all.push_back(z);
18+
}
19+
all.push_back(1);
20+
sort(all.begin(), all.end());
21+
reverse(all.begin(), all.end());
22+
all.erase(unique(all.begin(), all.end()), all.end());
23+
for (int z : all) {
24+
cnt[z] = 0;
25+
}
26+
for (int x : val) {
27+
if (x > 1)
28+
++cnt[x];
29+
++cnt[1];
30+
for (int z : fac[x])
31+
++cnt[z];
32+
}
33+
for (int x : all) {
34+
cnt[x] = 1LL * cnt[x] * cnt[x] % mod;
35+
}
36+
long long ans = 0;
37+
for (int x : all) {
38+
int cur = cnt[x];
39+
ans = (ans + 1LL * x * cur) % mod;
40+
for (int z : fac[x]) {
41+
cnt[z] -= cur;
42+
if (cnt[z] < 0)
43+
cnt[z] += mod;
44+
}
45+
if (x > 1) {
46+
cnt[1] -= cur;
47+
if (cnt[1] < 0)
48+
cnt[1] += mod;
49+
}
50+
}
51+
return ans;
52+
}
53+
54+
int main() {
55+
for (int i = 2; i < N; ++i) {
56+
for (int j = i+i; j < N; j += i) {
57+
fac[j].push_back(i);
58+
}
59+
}
60+
int maxi = 0, s = 0;
61+
for (int i = 2; i < N; ++i) {
62+
maxi = max(maxi, (int)fac[i].size());
63+
s += fac[i].size();
64+
}
65+
int n;
66+
scanf("%d", &n);
67+
vector<int> a(n+1);
68+
for (int i = 1; i <= n; ++i) {
69+
scanf("%d", &a[i]);
70+
}
71+
for (int i = 1; i <= n; ++i) {
72+
for (int j = i; j <= n; j += i) {
73+
elem[i].push_back(a[j]);
74+
}
75+
}
76+
long long ans = 0;
77+
for (int i = n; i >= 1; --i) {
78+
g[i] = solve(elem[i]);
79+
for (int j = i + i; j <= n; j += i) {
80+
g[i] -= g[j];
81+
if (g[i] < 0)
82+
g[i] += mod;
83+
}
84+
ans = (ans + g[i] * i) % mod;
85+
}
86+
printf("%lld\n", ans);
87+
return 0;
88+
}

0 commit comments

Comments
 (0)