比赛链接:Here

AB水题,

C - Sum of gcd of Tuples (Easy)

题意:\(\sum_{a=1}^{K} \sum_{b=1}^{K} \sum_{c=1}^{K} g c d(a, b, c)\)

数据范围:\(1\le K\le 200\)

思路:因为 \(k\) 比较小,我们直接跑暴力即可

int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
ll n; cin >> n;
ll ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
ans += __gcd(__gcd(i, j), k);
cout << ans;
}

D - RGB Triplets

题意:给一个长度为N的字符串S,只包含'R','B','G'。求有多少个三元组 \((i,j,k)(1\le i<j<k\le N)\) 满足 \(S_{i} \neq S_{j}, S_{i} \neq S_{k}, S_{j} \neq S_{k}, j-i \neq k-j_{\circ}\)

数据范围:\(1\le N \le 4000\)

题解:先将满足 \(_{i} \neq S_{j}, S_{i} \neq S_{k}, S_{j} \neq S_{k}\) 的算出来,在减去 \(j-i \neq k-j\) 的数目。

总的显然等于 \(num(R)*num(B)*num(G)\) ,然后枚举两个端点,判断第三个端点是不是不同于这个两个端点的颜色。

const int N = 4e3 + 5;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n; string s;
cin >> n >> s;
int a = 0, b = 0, c = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == 'R') a += 1;
if (s[i] == 'G') b += 1;
if (s[i] == 'B') c += 1;
}
ll ans = 1ll * a * b * c;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++) {
if (s[i] == s[j]) continue;
if (2 * j - i < n && s[i] != s[2 * j - i] && s[j] != s[2 * j - i]) ans--;
}
cout << ans;
}

E - Sum of gcd of Tuples (Hard)

题意:\(\sum_{a_{1}=1}^{K} \sum_{a_{2}=1}^{K} \ldots \sum_{a_{N}=1}^{K} g c d\left(a_{1}, a_{2}, \ldots, a_{N}\right)(\bmod 1 \mathrm{e} 9+7)\)

数据范围:\(2 \leq N \leq 10^{5}, 1 \leq K \leq 10^{5}\)

思路一:莫比乌斯反演化简

\[\begin{array}{l}
A n s=\sum_{a_{1}=1}^{K} \sum_{a_{2}=1}^{K} \ldots \sum_{a_{N}=1}^{K} g c d\left(a_{1}, a_{2}, \ldots, a_{N}\right) \\
=\sum_{i=1}^{K} \sum_{a_{1}=1}^{K} \sum_{a_{2}=1}^{K} \ldots \sum_{a_{N}=1}^{K} i\left[\operatorname{gcd}\left(a_{1}, a_{2}, \ldots, a_{N}\right)==i\right] \\
=\sum_{i=1}^{K} \sum_{a_{1}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \sum_{a_{2}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \ldots \sum_{a_{N}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} i\left[\operatorname{gcd}\left(a_{1}, a_{2}, \ldots, a_{N}\right)==1\right] \\
=\sum_{i=1}^{K} \sum_{a_{1}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \sum_{a_{2}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \ldots \sum_{a_{N}=1}^{\left\lfloor\frac{K}{i}\right\rfloor} i \sum_{d=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \mu(d)\left\lfloor\frac{d}{a_{1}}\right\rfloor\left\lfloor\frac{d}{a_{2}}\right\rfloor \ldots\left\lfloor\frac{d}{a N}\right\rfloor \\
=\sum_{i=1}^{K} i \sum_{d=1}^{\left\lfloor\frac{K}{\imath}\right\rfloor} \mu(d) \sum_{a_{1}=1}^{\left\lfloor\frac{K}{i d}\right\rfloor} \sum_{a 2=1}^{\left\lfloor\frac{K}{i d}\right\rfloor} \ldots \sum_{a N=1}^{\left\lfloor\frac{K}{i d}\right\rfloor} 1 \\
=\sum_{i=1}^{K} i \sum_{d=1}^{\left\lfloor\frac{K}{i}\right\rfloor} \mu(d)\left\lfloor\frac{K}{i d}\right\rfloor^{N} \\
=\sum_{T=1}^{K}\left\lfloor\frac{K}{T}\right\rfloor^{N} \sum_{d \mid T} \mu(d) *\left\lfloor\frac{T}{d}\right\rfloor(T=i d) \\
=\sum_{T=1}^{K}\left\lfloor\frac{K}{T}\right\rfloor^{N} \phi(T)
\end{array}
\]

由于 \(K\) 不大,预处理欧拉函数,直接遍历即可。\(K\) 大的话,整除分块加杜教筛(雾。

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int N = 1e5 + 5, MD = 1e9 + 7;
int pri[N], tot, phi[N];
bool p[N];
void init() {
p[1] = true, phi[1] = 1;
for (int i = 2; i < N; i++) {
if (!p[i]) pri[++tot] = i, phi[i] = i - 1;
for (int j = 1; j <= tot && i * pri[j] < N; j++) {
p[i * pri[j]] = true;
if (i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
break;
} else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
}
ll qpow(ll a, ll b) {
ll ans = 1;
for (; b; b >>= 1, a = a * a % MD) if (b & 1) ans = ans * a % MD;
return ans;
}
void add(int &x, int y) { x += y; if (x >= MD) x -= MD;}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
init();
int n, k, ans = 0;
cin >> n >> k;
for (int i = 1; i <= k; i++)
add(ans, 1LL * qpow(k / i, n)*phi[i] % MD); cout << ans;
}

思路二:

学习了下官方题解:定义 \(f[i]\) 代表 \(\gcd\) 为 \(i\) 的个数,递推关系式:\(f[i]=\left\lfloor\frac{K}{i}\right\rfloor^{N}-\sum_{j>i, i \mid j} f[j]_{\circ}\)​

双重循环即可,里面那层循环的复杂度总和是个调和级数,\(\log\) 级别的。

const int N = 1e5 + 5, MD = 1e9 + 7;
int f[N];
ll qpow(ll a, ll b) {
ll ans = 1;
for (; b; b >>= 1, a = a * a % MD) if (b & 1) ans = ans * a % MD;
return ans;
}
void add(int &x, int y) {
x += y;
if (x >= MD) x -= MD;
if (x < 0) x += MD;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n, k;
scanf("%d%d", &n, &k);
cin >> n >> k;
for (int i = k; i >= 1; i--) {
f[i] = qpow(k / i, n);
for (int j = 2 * i; j <= k; j += i)
add(f[i], -f[j]);
}
int ans = 0;
for (int i = 1; i <= k; i++)
add(ans, 1LL * f[i]*i % MD); cout << ans;
}

F - Select Half

题意:给一个长度为 \(N\) 的序列 \(A\),要求选 \(\left[\frac{N}{2}\right\rfloor\) 个数,且下标互不相邻,最大化它们的总和。

数据范围:\(2\le N\le 2\times 10^5\)

题解:对于选的数的下标, \(B_{1}, B_{2} \ldots, B_{\left\lfloor\frac{N}{2}\right\rfloor}\),可以发现 \(\sum_{i=2}^{\left\lfloor\frac{N}{2}\right\rfloor} B_{i}-B_{i-1}-2 \leq 2\)

因此定义 \(f[i][j]\)​ 代表选第 \(1~i\) 里面的数(必选第个 \(i\) 数),前面多空了 \(j\) 的最大值。

\[\left\{\begin{aligned}
f[i][0] &=f[i-2][0]+a[i] \\
f[i][1] &=\max (f[i-2][1], f[i-3][0])+a[i] \\
f[i][2] &=\max (f[i-2][2], f[i-3][1], f[i-4][0])+a[i]
\end{aligned}\right.
\]
const int N = 2e5 + 5;
int a[N];
ll f[N][3];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n; cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; i++)
for (int j = 0; j < 3; j++)
f[i][j] = -1e18; for (int i = 1; i <= 3; i++)
f[i][i - 1] = a[i]; f[3][0] = a[1] + a[3];
for (int i = 4; i <= n; i++) {
f[i][0] = f[i - 2][0] + a[i];
f[i][1] = max(f[i - 2][1], f[i - 3][0]) + a[i];
f[i][2] = max(f[i - 2][2], f[i - 3][1]) + a[i];
if (i > 4) f[i][2] = max(f[i][2], f[i - 4][0] + a[i]);
}
ll ans;
if (n & 1) ans = max(f[n][2], max(f[n - 1][1], f[n - 2][0]));
else
ans = max(f[n][1], f[n - 1][0]);
cout << ans;
}

AtCoder Beginner Contest 162 C~F的更多相关文章

  1. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  2. AtCoder Beginner Contest 162

    比赛链接:https://atcoder.jp/contests/abc162/tasks A - Lucky 7 #include <bits/stdc++.h> using names ...

  3. AtCoder Beginner Contest 131 Task F. Must Be Rectangular

    Score: 600 points Approach 固定横坐标 $x$,考虑横坐标为 $x$ 的竖直线上最多可以有几个点. Observations 若最初两条竖直线 $x_1$.$x_2$ 上都有 ...

  4. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  5. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  6. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  7. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  8. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  9. AtCoder Beginner Contest 161

    比赛链接:https://atcoder.jp/contests/abc161/tasks AtCoder Beginner Contest 161 第一次打AtCoder的比赛,因为是日本的网站终于 ...

  10. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

随机推荐

  1. UNI-APP之微信小程序转H5

    开始 最近有个需求,需要将微信小程序中一些页面和功能改成h5,这次功能开发的时间有点紧,而且重新写一套有点来不及.考虑到微信小程序与uni-app有着一些共通之处,所以打算直接转成uni-app.un ...

  2. 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)

    接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面 首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那么这些都有什么含 ...

  3. Opencv学习笔记(1)

    1.安装环境 如何安装Python解释器和PyCharm,这里就不说明了, 参考文章链接:https://blog.csdn.net/weixin_72959097/article/details/1 ...

  4. Tomcat国内安装及乱码解决详细步骤(无f墙)

    1.下载安装包 链接:https://pan.baidu.com/s/1x_hWMnUrui4aDYo9UE-GdA?pwd=p8kn 提取码:p8kn --来自百度网盘超级会员V4的分享 2.一键下 ...

  5. windows中MySQL忘记密码

    前言:   一直都是连接公司项目数据库,许久未连接本地的数据库,密码忘记了 步骤: 进入本机安装mysql的bin目录下 暂停mysql服务 net stop mysql 设置跳过密码授权登录  my ...

  6. 路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略. 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Fo ...

  7. C++ Qt开发:如何使用信号与槽

    在Qt中,信号与槽(Signal and Slot)是一种用于对象之间通信的机制.是Qt框架引以为傲的一项机制,它带来了许多优势,使得Qt成为一个强大且灵活的开发框架之一.信号与槽的关联通过QObje ...

  8. 华企盾DSC影响企业微信头像显示空白

    解决方法:1.首先用procmon监控头像存储目录解密一下重新登录企业微信 2.如果方法1不行那么将企业微信的缓存目录删除​ 上图将缓存文件剪切出来后,重登企业微信正常 ​ 上图为不显示头像的异常情况

  9. auto{x}与auto(x)---一位中国小伙为cppreference作出的贡献

      C++作为一门静态类型语言,是需要程序员声明变量类型的.然而来到了C++11,auto的诞生使得变量声明变得及为方便,尤其是对于比较长的模板类型,auto一定程度上为代码编写者减轻了负担.到了C+ ...

  10. ChatGPT API来了 附调用方法及文档

    3月1日,OpenAI 放出了ChatGPT API(GPT-3.5-turbo 模型),1000个tokens为$0.002美元,等于每输出 100 万个单词,价格才 2.7 美金(约 18 元人民 ...